Broken: repository references (you'll see in the test results) not tested: authenticated access to the repository. Already had a feature request for multiple repository support; would be nice. That and better diagnostics on failure. Note that we dont currently probe ibiblio for availaibility; that was taking longer than the fetches themselves. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276957 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -68,6 +68,8 @@ Other changes: | |||||
| * Added a new "failall" value for the onerror attribute of <typedef>. | * Added a new "failall" value for the onerror attribute of <typedef>. | ||||
| Bugzilla report 31685. | Bugzilla report 31685. | ||||
| * New task <getlibraries> can retrieve library files from a maven repository. | |||||
| Changes from Ant 1.6.2 to current Ant 1.6 CVS version | Changes from Ant 1.6.2 to current Ant 1.6 CVS version | ||||
| ===================================================== | ===================================================== | ||||
| @@ -328,6 +328,11 @@ | |||||
| <filename name="${ant.package}/launch/**/*"/> | <filename name="${ant.package}/launch/**/*"/> | ||||
| </selector> | </selector> | ||||
| <selector id="needs.commons.httpclient"> | |||||
| <filename name="${optional.package}/repository/**/*"/> | |||||
| </selector> | |||||
| <patternset id="onlinetests"> | <patternset id="onlinetests"> | ||||
| <exclude name="**/GetTest.java" if="offline"/> | <exclude name="**/GetTest.java" if="offline"/> | ||||
| <exclude name="**/SignJarTest.java" if="offline"/> | <exclude name="**/SignJarTest.java" if="offline"/> | ||||
| @@ -561,6 +566,17 @@ | |||||
| classpathref="classpath"/> | classpathref="classpath"/> | ||||
| </or> | </or> | ||||
| </condition> | </condition> | ||||
| <!-- http client needs commons logging --> | |||||
| <condition property="commons.httpclient.present"> | |||||
| <and> | |||||
| <available | |||||
| classname="org.apache.commons.httpclient.HttpClient" | |||||
| classpathref="classpath"/> | |||||
| <isset property="commons.logging.present"/> | |||||
| </and> | |||||
| </condition> | |||||
| <condition property="wsdl.found"> | <condition property="wsdl.found"> | ||||
| <or> | <or> | ||||
| <available file="wsdl" filepath="${env.PATH}"/> | <available file="wsdl" filepath="${env.PATH}"/> | ||||
| @@ -679,6 +695,7 @@ | |||||
| <selector refid="needs.jdepend" unless="jdepend.present"/> | <selector refid="needs.jdepend" unless="jdepend.present"/> | ||||
| <selector refid="needs.swing" unless="swing.present"/> | <selector refid="needs.swing" unless="swing.present"/> | ||||
| <selector refid="needs.jsch" unless="jsch.present"/> | <selector refid="needs.jsch" unless="jsch.present"/> | ||||
| <selector refid="needs.commons.httpclient" unless="commons.httpclient.present"/> | |||||
| </or> | </or> | ||||
| </not> | </not> | ||||
| </selector> | </selector> | ||||
| @@ -853,6 +870,7 @@ | |||||
| <selector refid="needs.jdepend"/> | <selector refid="needs.jdepend"/> | ||||
| <selector refid="needs.swing"/> | <selector refid="needs.swing"/> | ||||
| <selector refid="needs.jsch"/> | <selector refid="needs.jsch"/> | ||||
| <selector refid="needs.commons.httpclient"/> | |||||
| </or> | </or> | ||||
| </not> | </not> | ||||
| </and> | </and> | ||||
| @@ -897,6 +915,7 @@ | |||||
| <optional-jar dep="swing"/> | <optional-jar dep="swing"/> | ||||
| <optional-jar dep="jsch"/> | <optional-jar dep="jsch"/> | ||||
| <optional-jar dep="jdepend"/> | <optional-jar dep="jdepend"/> | ||||
| <optional-jar dep="commons.httpclient"/> | |||||
| <jar destfile="${build.lib}/${optional.jars.prefix}-weblogic.jar" | <jar destfile="${build.lib}/${optional.jars.prefix}-weblogic.jar" | ||||
| basedir="${build.classes}" | basedir="${build.classes}" | ||||
| @@ -1471,6 +1490,7 @@ | |||||
| <sysproperty key="ant.home" value="${ant.home}"/> | <sysproperty key="ant.home" value="${ant.home}"/> | ||||
| <sysproperty key="build.tests" file="${build.tests}"/> | <sysproperty key="build.tests" file="${build.tests}"/> | ||||
| <sysproperty key="offline" value="${offline}"/> | |||||
| <sysproperty key="build.tests.value" value="${build.tests.value}"/> | <sysproperty key="build.tests.value" value="${build.tests.value}"/> | ||||
| <sysproperty key="tests-classpath.value" | <sysproperty key="tests-classpath.value" | ||||
| value="${tests-classpath.value}"/> | value="${tests-classpath.value}"/> | ||||
| @@ -1624,6 +1644,7 @@ | |||||
| <sysproperty key="ant.home" value="${ant.home}"/> | <sysproperty key="ant.home" value="${ant.home}"/> | ||||
| <sysproperty key="build.tests" file="${build.tests}"/> | <sysproperty key="build.tests" file="${build.tests}"/> | ||||
| <sysproperty key="build.tests.value" value="${build.tests.value}"/> | <sysproperty key="build.tests.value" value="${build.tests.value}"/> | ||||
| <sysproperty key="offline" value="${offline}"/> | |||||
| <sysproperty key="tests-classpath.value" | <sysproperty key="tests-classpath.value" | ||||
| value="${tests-classpath.value}"/> | value="${tests-classpath.value}"/> | ||||
| <classpath refid="tests-classpath"/> | <classpath refid="tests-classpath"/> | ||||
| @@ -0,0 +1,112 @@ | |||||
| <?xml version="1.0"?> | |||||
| <project name="getlibraries" basedir="." default="all"> | |||||
| <!-- use the normal one at ibiblio--> | |||||
| <mavenrepository id="maven"/> | |||||
| <target name="init"> | |||||
| <property name="lib.dir" value="getlib"/> | |||||
| <mkdir dir="${lib.dir}"/> | |||||
| <property name="commons.logging" value="commons-logging-1.0.1.jar"/> | |||||
| <presetdef name="getlib"> | |||||
| <getlibraries destDir="${lib.dir}"> | |||||
| <library archive="commons-logging" project="commons-logging" version="1.0.1"/> | |||||
| </getlibraries> | |||||
| </presetdef> | |||||
| <macrodef name="assert-downloaded"> | |||||
| <attribute name="library" default="${commons.logging}"/> | |||||
| <sequential> | |||||
| <available property="@{library}.exists" | |||||
| file="${lib.dir}/@{library}"/> | |||||
| <fail unless="@{library}.exists"> | |||||
| Not found: ${lib.dir}@{library} | |||||
| </fail> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete dir="${lib.dir}"/> | |||||
| </target> | |||||
| <target name="testEmpty" depends="init"> | |||||
| <getlibraries/> | |||||
| </target> | |||||
| <target name="testEmpty2" depends="init"> | |||||
| <getlibraries destDir="${lib.dir}"> | |||||
| </getlibraries> | |||||
| </target> | |||||
| <target name="testEmpty3" depends="init"> | |||||
| <getlibraries destDir="${lib.dir}"> | |||||
| <repository/> | |||||
| </getlibraries> | |||||
| </target> | |||||
| <target name="testNoRepo" depends="init"> | |||||
| <getlib/> | |||||
| </target> | |||||
| <target name="testUnknownReference" depends="init"> | |||||
| <getlib> | |||||
| <repository refid="unknown"/> | |||||
| </getlib> | |||||
| </target> | |||||
| <target name="testFunctionalInline" depends="init"> | |||||
| <getlib repositoryref="maven"> | |||||
| </getlib> | |||||
| <assert-downloaded/> | |||||
| </target> | |||||
| <target name="testMavenInline" depends="init"> | |||||
| <getlib> | |||||
| <mavenrepository/> | |||||
| </getlib> | |||||
| <assert-downloaded/> | |||||
| </target> | |||||
| <target name="testTwoRepositories" depends="init"> | |||||
| <getlib> | |||||
| <mavenrepository/> | |||||
| <mavenrepository/> | |||||
| </getlib> | |||||
| </target> | |||||
| <target name="testMavenInlineBadURL" depends="init"> | |||||
| <getlib> | |||||
| </getlib> | |||||
| </target> | |||||
| <target name="testRenaming" depends="init"> | |||||
| <getlib> | |||||
| <mavenrepository/> | |||||
| <library archive="commons-logging" project="commons-logging" version="1.0.1" | |||||
| destinationName="renamed.jar" | |||||
| /> | |||||
| </getlib> | |||||
| <assert-downloaded/> | |||||
| <assert-downloaded library="renamed.jar"/> | |||||
| </target> | |||||
| <target name="testOverwrite" depends="init"> | |||||
| <getlib> | |||||
| <mavenrepository/> | |||||
| </getlib> | |||||
| <assert-downloaded/> | |||||
| <getlib> | |||||
| <mavenrepository/> | |||||
| </getlib> | |||||
| </target> | |||||
| </project> | |||||
| @@ -203,6 +203,7 @@ rexec=org.apache.tools.ant.taskdefs.optional.net.RExecTask | |||||
| scriptdef=org.apache.tools.ant.taskdefs.optional.script.ScriptDef | scriptdef=org.apache.tools.ant.taskdefs.optional.script.ScriptDef | ||||
| ildasm=org.apache.tools.ant.taskdefs.optional.dotnet.Ildasm | ildasm=org.apache.tools.ant.taskdefs.optional.dotnet.Ildasm | ||||
| apt=org.apache.tools.ant.taskdefs.Apt | apt=org.apache.tools.ant.taskdefs.Apt | ||||
| getlibraries=org.apache.tools.ant.taskdefs.optional.repository.GetLibraries | |||||
| # deprecated ant tasks (kept for back compatibility) | # deprecated ant tasks (kept for back compatibility) | ||||
| starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut | starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut | ||||
| @@ -0,0 +1,315 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.repository; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.types.Reference; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.util.Iterator; | |||||
| import java.util.LinkedList; | |||||
| import java.util.List; | |||||
| /** | |||||
| * This task will retrieve one or more libraries from a repository. <ol> | |||||
| * <li>Users must declare a repository, either inline or by reference</li> | |||||
| * <li>Dependency checking is used (timestamps) unless forceDownload=true</li> | |||||
| * <li>It is an error if, at the end of the task, a library is missing. | |||||
| * | |||||
| * @ant.task | |||||
| * @since Ant 1.7 | |||||
| */ | |||||
| public class GetLibraries extends Task { | |||||
| /** | |||||
| * destination | |||||
| */ | |||||
| private File destDir; | |||||
| /** | |||||
| * flag to force a download | |||||
| */ | |||||
| private boolean forceDownload = false; | |||||
| /** | |||||
| * flag to force offline | |||||
| */ | |||||
| private boolean offline = false; | |||||
| /** | |||||
| * list of libraries | |||||
| */ | |||||
| private List libraries = new LinkedList(); | |||||
| /** | |||||
| * repository for retrieval | |||||
| */ | |||||
| private Repository repository; | |||||
| public static final String ERROR_ONE_REPOSITORY_ONLY = "Only one repository is allowed"; | |||||
| public static final String ERROR_NO_DEST_DIR = "No destination directory"; | |||||
| public static final String ERROR_NO_REPOSITORY = "No repository defined"; | |||||
| public static final String ERROR_NO_LIBRARIES = "No libraries to load"; | |||||
| public static final String ERROR_REPO_PROBE_FAILED = "repository probe failed with "; | |||||
| public static final String ERROR_LIBRARY_FETCH_FAILED = "failed to retrieve "; | |||||
| public static final String ERROR_FORCED_DOWNLOAD_FAILED = "Failed to download every file on a forced download"; | |||||
| public static final String ERROR_INCOMPLETE_RETRIEVAL = "Not all libraries could be retrieved"; | |||||
| /** | |||||
| * add a repository. Only one is (currently) supported | |||||
| * | |||||
| * @param repo | |||||
| */ | |||||
| public void add(Repository repo) { | |||||
| if (repository != null) { | |||||
| throw new BuildException(ERROR_ONE_REPOSITORY_ONLY); | |||||
| } | |||||
| repository = repo; | |||||
| } | |||||
| /** | |||||
| * add a repository. Unless there is explicit support for a subclass | |||||
| * | |||||
| * @param repo | |||||
| */ | |||||
| public void addRepository(RepositoryRef repo) { | |||||
| add(repo); | |||||
| } | |||||
| /** | |||||
| * add a maven repository. | |||||
| */ | |||||
| /* | |||||
| public void addMavenRepository(MavenRepository repo) { | |||||
| add(repo); | |||||
| } | |||||
| */ | |||||
| /** | |||||
| * bind to a repository. | |||||
| */ | |||||
| public void setRepositoryRef(final Reference ref) { | |||||
| //create a special repository that can only | |||||
| //resolve references. | |||||
| Repository r = new RepositoryRef(getProject(), ref); | |||||
| add(r); | |||||
| } | |||||
| /** | |||||
| * add a library for retrieval | |||||
| * | |||||
| * @param lib | |||||
| */ | |||||
| public void addLibrary(Library lib) { | |||||
| libraries.add(lib); | |||||
| } | |||||
| /** | |||||
| * destination directory for all library files | |||||
| * | |||||
| * @param destDir | |||||
| */ | |||||
| public void setDestDir(File destDir) { | |||||
| this.destDir = destDir; | |||||
| } | |||||
| /** | |||||
| * flag to force a download even if the clock indicates it aint needed. | |||||
| * | |||||
| * @param forceDownload | |||||
| */ | |||||
| public void setForceDownload(boolean forceDownload) { | |||||
| this.forceDownload = forceDownload; | |||||
| } | |||||
| /** | |||||
| * test for being offline | |||||
| * | |||||
| * @return true if the offline flag is set | |||||
| */ | |||||
| public boolean isOffline() { | |||||
| return offline; | |||||
| } | |||||
| /** | |||||
| * declare the system offline. This disables any attempt to retrieve files. | |||||
| * In this mode, only the presence of files is verified. If forceDownload is | |||||
| * true, or there is a missing library, then an error will be raised. | |||||
| * | |||||
| * @param offline | |||||
| */ | |||||
| public void setOffline(boolean offline) { | |||||
| this.offline = offline; | |||||
| } | |||||
| public File getDestDir() { | |||||
| return destDir; | |||||
| } | |||||
| public boolean isForceDownload() { | |||||
| return forceDownload; | |||||
| } | |||||
| public List getLibraries() { | |||||
| return libraries; | |||||
| } | |||||
| public Repository getRepository() { | |||||
| return repository; | |||||
| } | |||||
| /** | |||||
| * validate ourselves | |||||
| * | |||||
| * @throws BuildException | |||||
| */ | |||||
| public void validate() { | |||||
| if (destDir == null || !destDir.exists() || !destDir.isDirectory()) { | |||||
| throw new BuildException(ERROR_NO_DEST_DIR); | |||||
| } | |||||
| if (repository == null) { | |||||
| throw new BuildException(ERROR_NO_REPOSITORY); | |||||
| } | |||||
| Iterator it = libraries.iterator(); | |||||
| while (it.hasNext()) { | |||||
| Library library = (Library) it.next(); | |||||
| library.validate(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Called by the project to let the task do its work. | |||||
| * | |||||
| * @throws org.apache.tools.ant.BuildException | |||||
| * if something goes wrong with the build | |||||
| */ | |||||
| public void execute() throws BuildException { | |||||
| validate(); | |||||
| Repository repo = repository.resolve(); | |||||
| repo.validate(); | |||||
| int toFetch = libraries.size(); | |||||
| if (toFetch == 0) { | |||||
| throw new BuildException(ERROR_NO_LIBRARIES); | |||||
| } | |||||
| int fetched = 0; | |||||
| log("Getting libraries from " + repo.toString(), Project.MSG_VERBOSE); | |||||
| log("Saving libraries to " + destDir.toString(), Project.MSG_VERBOSE); | |||||
| bindAllLibraries(); | |||||
| if (isOffline()) { | |||||
| log("No retrieval, task is \"offline\""); | |||||
| verifyAllLibrariesPresent(); | |||||
| return; | |||||
| } | |||||
| //connect the repository | |||||
| repo.connect(this); | |||||
| try { | |||||
| //check for reachability. | |||||
| //it is up to each repository to decide that. | |||||
| boolean reachable; | |||||
| try { | |||||
| log("Checking repository for reachability", Project.MSG_DEBUG); | |||||
| reachable = repo.checkRepositoryReachable(); | |||||
| } catch (IOException e) { | |||||
| log(ERROR_REPO_PROBE_FAILED + e.getMessage(), | |||||
| Project.MSG_VERBOSE); | |||||
| reachable = false; | |||||
| } | |||||
| if (!reachable) { | |||||
| if (forceDownload) { | |||||
| throw new BuildException(repo.toString() | |||||
| + " is unreachable and forceDownload is set"); | |||||
| } | |||||
| } else { | |||||
| log("Repository is live", Project.MSG_DEBUG); | |||||
| } | |||||
| //iterate through the libs we have | |||||
| Iterator it = libraries.iterator(); | |||||
| while (it.hasNext()) { | |||||
| Library library = (Library) it.next(); | |||||
| library.bind(destDir); | |||||
| try { | |||||
| if (repo.fetch(library)) { | |||||
| fetched++; | |||||
| } | |||||
| } catch (IOException e) { | |||||
| //failures to fetch are logged at verbose level | |||||
| log(ERROR_LIBRARY_FETCH_FAILED + library); | |||||
| log(e.getMessage(), Project.MSG_VERBOSE); | |||||
| } | |||||
| } | |||||
| } finally { | |||||
| repo.disconnect(); | |||||
| } | |||||
| //at this point downloads have finished. | |||||
| //we do still need to verify that everything worked. | |||||
| if ((fetched < toFetch && forceDownload)) { | |||||
| throw new BuildException(ERROR_FORCED_DOWNLOAD_FAILED); | |||||
| } | |||||
| verifyAllLibrariesPresent(); | |||||
| } | |||||
| /** | |||||
| * bind all libraries to our destination | |||||
| */ | |||||
| protected void bindAllLibraries() { | |||||
| Iterator it = libraries.iterator(); | |||||
| while (it.hasNext()) { | |||||
| Library library = (Library) it.next(); | |||||
| library.bind(destDir); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * verify that all libraries are present | |||||
| */ | |||||
| protected void verifyAllLibrariesPresent() { | |||||
| //iterate through the libs we have | |||||
| boolean missing = false; | |||||
| Iterator it = libraries.iterator(); | |||||
| while (it.hasNext()) { | |||||
| Library library = (Library) it.next(); | |||||
| //check for the library existing | |||||
| if (!library.exists()) { | |||||
| //and log if one is missing | |||||
| log("Missing: " + library.toString(), | |||||
| Project.MSG_ERR); | |||||
| missing = true; | |||||
| } | |||||
| } | |||||
| if (missing) { | |||||
| throw new BuildException(ERROR_INCOMPLETE_RETRIEVAL); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,447 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.repository; | |||||
| import org.apache.commons.httpclient.*; | |||||
| import org.apache.commons.httpclient.cookie.CookiePolicy; | |||||
| import org.apache.commons.httpclient.methods.GetMethod; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| import java.io.File; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.io.InputStream; | |||||
| import java.net.MalformedURLException; | |||||
| import java.net.URL; | |||||
| import java.util.Date; | |||||
| /** | |||||
| * This is a base class for repositories that are built on URLs. Although you | |||||
| * can share this datatype, it is *not* thread safe; you can only use it in one | |||||
| * thread at at time | |||||
| * | |||||
| * @since Ant1.7 | |||||
| */ | |||||
| public abstract class HttpRepository extends Repository { | |||||
| /** | |||||
| * repositoryURL of repository | |||||
| */ | |||||
| private String url; | |||||
| /** | |||||
| * username | |||||
| */ | |||||
| private String username; | |||||
| /** | |||||
| * password | |||||
| */ | |||||
| private String password; | |||||
| /** | |||||
| * auth realm; can be null | |||||
| */ | |||||
| private String realm; | |||||
| /** | |||||
| * this is our http client | |||||
| */ | |||||
| private HttpClient client; | |||||
| /** | |||||
| * number of times to retry fetches | |||||
| */ | |||||
| private int retries = 1; | |||||
| /** | |||||
| * no repository URL | |||||
| */ | |||||
| public static final String ERROR_NO_REPOSITORY_URL = "No repository URL"; | |||||
| /** | |||||
| * owner class | |||||
| */ | |||||
| private GetLibraries owner; | |||||
| /** | |||||
| * retry logic | |||||
| */ | |||||
| private DefaultMethodRetryHandler retryhandler; | |||||
| public static final String ERROR_REENTRANT_USE = "Repository is already in use"; | |||||
| private static final String IF_MODIFIED_SINCE = "If-Modified-Since"; | |||||
| private static final int BLOCKSIZE = 8192; | |||||
| /** | |||||
| * get the base URL of the repository | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public String getUrl() { | |||||
| return url; | |||||
| } | |||||
| /** | |||||
| * Set the base URL of the repository | |||||
| * | |||||
| * @param url | |||||
| */ | |||||
| public void setUrl(String url) { | |||||
| this.url = url; | |||||
| } | |||||
| public String getUsername() { | |||||
| return username; | |||||
| } | |||||
| /** | |||||
| * set the username for the remote repository | |||||
| * | |||||
| * @param username | |||||
| */ | |||||
| public void setUsername(String username) { | |||||
| this.username = username; | |||||
| } | |||||
| public String getPassword() { | |||||
| return password; | |||||
| } | |||||
| /** | |||||
| * set the password for the remote repository | |||||
| * | |||||
| * @param password | |||||
| */ | |||||
| public void setPassword(String password) { | |||||
| this.password = password; | |||||
| } | |||||
| public String getRealm() { | |||||
| return realm; | |||||
| } | |||||
| /** | |||||
| * set the realm for authentication; empty string is equivalent to "any | |||||
| * realm" (the default) | |||||
| * | |||||
| * @param realm | |||||
| */ | |||||
| public void setRealm(String realm) { | |||||
| if (realm != null) { | |||||
| this.realm = realm; | |||||
| } else { | |||||
| this.realm = null; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @return number of times to retry fetches | |||||
| */ | |||||
| public int getRetries() { | |||||
| return retries; | |||||
| } | |||||
| /** | |||||
| * number of times to retry fetches | |||||
| * | |||||
| * @param retries | |||||
| */ | |||||
| public void setRetries(int retries) { | |||||
| this.retries = retries; | |||||
| } | |||||
| /** | |||||
| * get the client | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public HttpClient getClient() { | |||||
| return client; | |||||
| } | |||||
| public GetLibraries getOwner() { | |||||
| return owner; | |||||
| } | |||||
| /** | |||||
| * validate yourself | |||||
| * | |||||
| * @throws org.apache.tools.ant.BuildException | |||||
| * if unhappy | |||||
| */ | |||||
| public void validate() { | |||||
| super.validate(); | |||||
| checkChildrenAllowed(); | |||||
| checkAttributesAllowed(); | |||||
| if (url == null || url.length() == 0) { | |||||
| throw new BuildException(ERROR_NO_REPOSITORY_URL); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * override point: connection is called at the start of the retrieval | |||||
| * process | |||||
| * | |||||
| * @param newOwner | |||||
| * | |||||
| * @throws org.apache.tools.ant.BuildException | |||||
| * | |||||
| */ | |||||
| public void connect(GetLibraries newOwner) { | |||||
| this.owner = newOwner; | |||||
| if (client != null) { | |||||
| throw new BuildException(ERROR_REENTRANT_USE); | |||||
| } | |||||
| if (!url.endsWith("/")) { | |||||
| url = url + '/'; | |||||
| } | |||||
| client = new HttpClient(); | |||||
| //retry handler | |||||
| retryhandler = new DefaultMethodRetryHandler(); | |||||
| retryhandler.setRequestSentRetryEnabled(false); | |||||
| retryhandler.setRetryCount(retries); | |||||
| //validate the URL | |||||
| URL repository; | |||||
| try { | |||||
| repository = new URL(url); | |||||
| } catch (MalformedURLException e) { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| //authentication | |||||
| if (username != null) { | |||||
| Credentials defaultcreds = | |||||
| new UsernamePasswordCredentials(username, password); | |||||
| client.getState().setCredentials(realm, | |||||
| repository.getHost(), | |||||
| defaultcreds); | |||||
| //turn auth on on first call | |||||
| client.getState().setAuthenticationPreemptive(true); | |||||
| } | |||||
| //cookies | |||||
| client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY); | |||||
| } | |||||
| /** | |||||
| * override point: connection is called at the start of the retrieval | |||||
| * process | |||||
| * | |||||
| * @throws org.apache.tools.ant.BuildException | |||||
| * | |||||
| */ | |||||
| public void disconnect() { | |||||
| client = null; | |||||
| retryhandler = null; | |||||
| } | |||||
| /** | |||||
| * Test for a repository being reachable. This method is called after {@link | |||||
| * #connect(org.apache.tools.ant.taskdefs.optional.repository.GetLibraries)} | |||||
| * is called, before any files are to be retrieved. | |||||
| * <p/> | |||||
| * If it returns false the repository considers itself offline. Similarly, | |||||
| * any ioexception is interpreted as being offline. | |||||
| * <p/> | |||||
| * The Http implementation probes for the base URL being reachable, and | |||||
| * returning a 200 status code. | |||||
| * | |||||
| * @return true if the repository is online. | |||||
| * | |||||
| * @throws java.io.IOException | |||||
| */ | |||||
| public boolean checkRepositoryReachable() throws IOException { | |||||
| //return pingBaseURL(); | |||||
| return true; | |||||
| } | |||||
| private boolean pingBaseURL() throws IOException { | |||||
| GetMethod get = createGet(getUrl()); | |||||
| client.executeMethod(get); | |||||
| return get.getStatusCode() == HttpStatus.SC_OK; | |||||
| } | |||||
| /** | |||||
| * create a new getMethod against any URI | |||||
| * | |||||
| * @param url | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public GetMethod createGet(String url) { | |||||
| GetMethod method = new GetMethod(url); | |||||
| method.setMethodRetryHandler(retryhandler); | |||||
| method.setDoAuthentication(true); | |||||
| method.setFollowRedirects(true); | |||||
| return method; | |||||
| } | |||||
| /** | |||||
| * @param method | |||||
| * @param timestamp | |||||
| * | |||||
| * @link http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#if-modified-since | |||||
| * @link http://www.w3.org/Protocols/rfc850/rfc850.html#z10 | |||||
| */ | |||||
| public void setIfModifiedSinceHeader(HttpMethod method, long timestamp) { | |||||
| Date date = new Date(timestamp); | |||||
| //ooh, naughty, deprecated. and like why is it deprecated? | |||||
| method.setRequestHeader(IF_MODIFIED_SINCE, date.toGMTString()); | |||||
| } | |||||
| /** | |||||
| * fetch a library from the repository | |||||
| * | |||||
| * @param library | |||||
| * | |||||
| * @return true if we retrieved | |||||
| * | |||||
| * @throws org.apache.tools.ant.BuildException | |||||
| * | |||||
| */ | |||||
| public boolean fetch(Library library) throws IOException { | |||||
| String path = getRemoteLibraryURL(library); | |||||
| logVerbose("Library URL=" + path); | |||||
| logVerbose("destination =" + library.getAbsolutePath()); | |||||
| GetMethod get = createGet(path); | |||||
| boolean useTimestamps = !getOwner().isForceDownload() && | |||||
| !library.exists(); | |||||
| if (useTimestamps) { | |||||
| setIfModifiedSinceHeader(get, library.getLastModified()); | |||||
| } | |||||
| try { | |||||
| long start, finish; | |||||
| start = System.currentTimeMillis(); | |||||
| client.executeMethod(get); | |||||
| if (useTimestamps && get.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) { | |||||
| logDebug("File is not modified"); | |||||
| //we get here if there is no change in timestamp | |||||
| //so no fetch | |||||
| return false; | |||||
| } | |||||
| if (get.getStatusCode() != HttpStatus.SC_OK) { | |||||
| String message = "Request Failed:" | |||||
| + get.getStatusCode() | |||||
| + " from " + get.getPath(); | |||||
| logVerbose(message); | |||||
| logVerbose(get.getStatusLine().toString()); | |||||
| logVerbose(get.getStatusText()); | |||||
| throw new BuildException(message); | |||||
| } | |||||
| saveStreamToLibrary(get, library); | |||||
| finish = System.currentTimeMillis(); | |||||
| long diff = finish - start; | |||||
| logVerbose("downloaded in " + diff / 1000 + " seconds"); | |||||
| } finally { | |||||
| // Release the connection. | |||||
| get.releaseConnection(); | |||||
| } | |||||
| return true; | |||||
| } | |||||
| /** | |||||
| * log something at the verbose level | |||||
| * | |||||
| * @param message text to log | |||||
| */ | |||||
| protected void logVerbose(String message) { | |||||
| getOwner().log(message, | |||||
| Project.MSG_VERBOSE); | |||||
| } | |||||
| protected void logDebug(String message) { | |||||
| getOwner().log(message, | |||||
| Project.MSG_DEBUG); | |||||
| } | |||||
| /** | |||||
| * Get the path to a remote library. This is the full URL | |||||
| * | |||||
| * @param library | |||||
| * | |||||
| * @return URL to library | |||||
| */ | |||||
| protected abstract String getRemoteLibraryURL(Library library); | |||||
| /** | |||||
| * save a stream from a connection to a library. prerequisite: connection | |||||
| * open and response=200. | |||||
| * | |||||
| * @param get | |||||
| * @param library | |||||
| * | |||||
| * @throws java.io.IOException on any trouble. | |||||
| */ | |||||
| protected void saveStreamToLibrary(GetMethod get, Library library) | |||||
| throws IOException { | |||||
| //we only get here if we are happy | |||||
| //so save it to a temp file | |||||
| File tempDest = File.createTempFile("download", ".bin", getOwner() | |||||
| .getDestDir()); | |||||
| logDebug("Saving file to " + tempDest); | |||||
| FileOutputStream fos = new FileOutputStream(tempDest); | |||||
| InputStream is = get.getResponseBodyAsStream(); | |||||
| boolean finished = false; | |||||
| try { | |||||
| byte[] buffer = new byte[BLOCKSIZE]; | |||||
| int length; | |||||
| while ((length = is.read(buffer)) >= 0) { | |||||
| fos.write(buffer, 0, length); | |||||
| } | |||||
| finished = true; | |||||
| } finally { | |||||
| FileUtils.close(fos); | |||||
| FileUtils.close(is); | |||||
| // we have started to (over)write dest, but failed. | |||||
| // Try to delete the garbage we'd otherwise leave | |||||
| // behind. | |||||
| if (!finished) { | |||||
| logVerbose("Deleting temporary file after failed download"); | |||||
| tempDest.delete(); | |||||
| } | |||||
| } | |||||
| logDebug("download complete; renaming destination file"); | |||||
| //then copy over the file | |||||
| File libraryFile = library.getLibraryFile(); | |||||
| if (libraryFile.exists()) { | |||||
| libraryFile.delete(); | |||||
| } | |||||
| // set the dest file | |||||
| if (!tempDest.renameTo(libraryFile)) { | |||||
| tempDest.delete(); | |||||
| throw new IOException( | |||||
| "Could not rename temp file to destination file"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Returns a string representation of the repository | |||||
| * | |||||
| * @return the base URL | |||||
| */ | |||||
| public String toString() { | |||||
| return "Repository at " + getUrl(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,218 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.repository; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import java.io.File; | |||||
| /** | |||||
| * How we represent libraries | |||||
| * | |||||
| * @since 20-Oct-2004 | |||||
| */ | |||||
| public class Library { | |||||
| //project "ant" | |||||
| private String project; | |||||
| //version "1.5" | |||||
| private String version; | |||||
| //archive prefix "ant-optional" | |||||
| private String archive; | |||||
| /** | |||||
| * very optional attribute; name of the destination. Autocalculated if not | |||||
| * set. | |||||
| */ | |||||
| private String destinationName; | |||||
| private File libraryFile; | |||||
| public static final String ERROR_NO_ARCHIVE = "No archive defined"; | |||||
| public static final String ERROR_NO_PROJECT = "No project defined"; | |||||
| public static final String ERROR_NO_VERSION = "No version defined"; | |||||
| public static final String ERROR_NO_SUFFIX = "No version defined"; | |||||
| /** | |||||
| * suffix | |||||
| */ | |||||
| private String suffix = "jar"; | |||||
| public String getProject() { | |||||
| return project; | |||||
| } | |||||
| public void setProject(String project) { | |||||
| this.project = project; | |||||
| } | |||||
| public String getVersion() { | |||||
| return version; | |||||
| } | |||||
| public void setVersion(String version) { | |||||
| this.version = version; | |||||
| } | |||||
| public String getArchive() { | |||||
| return archive; | |||||
| } | |||||
| public void setArchive(String archive) { | |||||
| this.archive = archive; | |||||
| } | |||||
| public String getDestinationName() { | |||||
| return destinationName; | |||||
| } | |||||
| public void setDestinationName(String destinationName) { | |||||
| this.destinationName = destinationName; | |||||
| } | |||||
| /** | |||||
| * get the suffix for this file. | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public String getSuffix() { | |||||
| return suffix; | |||||
| } | |||||
| public void setSuffix(String suffix) { | |||||
| this.suffix = suffix; | |||||
| } | |||||
| public File getLibraryFile() { | |||||
| return libraryFile; | |||||
| } | |||||
| /** | |||||
| * fault if the field is null or empty | |||||
| * | |||||
| * @param field | |||||
| * @param message text for fault | |||||
| * | |||||
| * @throws BuildException if the field is not set up | |||||
| */ | |||||
| private void faultIfEmpty(String field, String message) { | |||||
| if (field == null || field.length() == 0) { | |||||
| throw new BuildException(message); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * validate; | |||||
| * | |||||
| * @throws BuildException if invalid | |||||
| */ | |||||
| public void validate() { | |||||
| faultIfEmpty(archive, ERROR_NO_ARCHIVE); | |||||
| faultIfEmpty(project, ERROR_NO_PROJECT); | |||||
| faultIfEmpty(version, ERROR_NO_VERSION); | |||||
| faultIfEmpty(version, ERROR_NO_SUFFIX); | |||||
| } | |||||
| public String toString() { | |||||
| return "Library " + getNormalFilename() | |||||
| + " from project " + project | |||||
| + " to " + getDestinationName(); | |||||
| } | |||||
| /** | |||||
| * calculare the destination file of a library | |||||
| * | |||||
| * @param baseDir | |||||
| * | |||||
| * @throws BuildException if invalid | |||||
| */ | |||||
| public void bind(File baseDir) { | |||||
| validate(); | |||||
| if (destinationName == null) { | |||||
| destinationName = getNormalFilename(); | |||||
| } | |||||
| libraryFile = new File(baseDir, destinationName); | |||||
| } | |||||
| /** | |||||
| * a test that is only valid after binding | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public boolean exists() { | |||||
| return libraryFile.exists(); | |||||
| } | |||||
| /** | |||||
| * get the last modified date | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public long getLastModified() { | |||||
| return libraryFile.lastModified(); | |||||
| } | |||||
| /** | |||||
| * get the filename from the rule of archive+version+'.'+suffix. Clearly | |||||
| * only valid if all fields are defined. | |||||
| * | |||||
| * @return a string representing the expected name of the file at the | |||||
| * source | |||||
| */ | |||||
| public String getNormalFilename() { | |||||
| return archive + "-" + version + "." + suffix; | |||||
| } | |||||
| /** | |||||
| * get the filename of the destination; no path. | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public String getDestFilename() { | |||||
| if (destinationName == null) { | |||||
| return getNormalFilename(); | |||||
| } else { | |||||
| return destinationName; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * get a maven path (project/filename) | |||||
| * | |||||
| * @param separator directory separator | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public String getMavenPath(char separator) { | |||||
| return project + separator + "jars" + separator + getNormalFilename(); | |||||
| } | |||||
| /** | |||||
| * get the absolute path of this library | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public String getAbsolutePath() { | |||||
| return libraryFile.getAbsolutePath(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,65 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.repository; | |||||
| /** | |||||
| * A Maven repository knows about maven repository layout rules It also defaults | |||||
| * to http://www.ibiblio.org/maven/ | |||||
| * | |||||
| * @link http://maven.apache.org/reference/user-guide.html#Remote_Repository_Layout | |||||
| * @link | |||||
| * @since Ant1.7 | |||||
| */ | |||||
| public class MavenRepository extends HttpRepository { | |||||
| public static final String MAVEN_URL = "http://www.ibiblio.org/maven/"; | |||||
| /** | |||||
| * bind to the main maven repository | |||||
| */ | |||||
| public MavenRepository() { | |||||
| setUrl(MAVEN_URL); | |||||
| } | |||||
| /** | |||||
| * Get the path to a remote library. This is the full URL | |||||
| * | |||||
| * @param library | |||||
| * | |||||
| * @return URL to library | |||||
| */ | |||||
| protected String getRemoteLibraryURL(Library library) { | |||||
| String base = getUrl(); | |||||
| if (!base.endsWith("/")) { | |||||
| base = base + '/'; | |||||
| } | |||||
| return base + library.getMavenPath('/'); | |||||
| } | |||||
| /** | |||||
| * Returns a string representation of the repository | |||||
| * | |||||
| * @return the base URL | |||||
| */ | |||||
| public String toString() { | |||||
| return "Maven Repository at " + getUrl(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,109 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.repository; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.types.DataType; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * This type represents a repository; a place that stores libraries for | |||||
| * retrieval. To use this type, you must use a non-abstract class, either one | |||||
| * that ships with Ant, or one you implement and declare yourself. | |||||
| * <p/> | |||||
| * The <getlibraries> task lets you supply a repository by reference | |||||
| * inline {@link GetLibraries#add(Repository)} or on the command line {@link | |||||
| * GetLibraries#setRepositoryRef(org.apache.tools.ant.types.Reference)} | |||||
| * | |||||
| * @since Ant1.7 | |||||
| */ | |||||
| public abstract class Repository extends DataType { | |||||
| /** | |||||
| * validate yourself | |||||
| * | |||||
| * @throws BuildException if unhappy | |||||
| */ | |||||
| public void validate() { | |||||
| } | |||||
| /** | |||||
| * recursively resolve any references to get the real repository | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public final Repository resolve() { | |||||
| if (getRefid() == null) { | |||||
| return this; | |||||
| } else { | |||||
| Repository repository = (Repository) getCheckedRef(this.getClass(), | |||||
| "Repository"); | |||||
| return repository; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * override point: connection is called at the start of the retrieval | |||||
| * process | |||||
| * | |||||
| * @param owner owner of the libraries | |||||
| * | |||||
| * @throws BuildException | |||||
| */ | |||||
| public void connect(GetLibraries owner) { | |||||
| } | |||||
| /** | |||||
| * override point: connection is called at the start of the retrieval | |||||
| * process | |||||
| * | |||||
| * @throws BuildException | |||||
| */ | |||||
| public void disconnect() { | |||||
| } | |||||
| /** | |||||
| * Test for a repository being reachable. This method is called after {@link | |||||
| * #connect(GetLibraries)} is called, before any files are to be retrieved. | |||||
| * <p/> | |||||
| * If it returns false the repository considers itself offline. Similarly, | |||||
| * any ioexception is interpreted as being offline. | |||||
| * | |||||
| * @return true if the repository is online. | |||||
| * | |||||
| * @throws IOException | |||||
| */ | |||||
| public abstract boolean checkRepositoryReachable() throws IOException; | |||||
| /** | |||||
| * fetch a library from the repository | |||||
| * | |||||
| * @param library | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public abstract boolean fetch(Library library) throws IOException; | |||||
| } | |||||
| @@ -0,0 +1,76 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.repository; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.Reference; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * not a real repository; one to paste a reference into the chain for | |||||
| * resolution. | |||||
| * | |||||
| * @since Ant1.7 | |||||
| */ | |||||
| public final class RepositoryRef extends Repository { | |||||
| /** | |||||
| * create a repository reference | |||||
| * | |||||
| * @param reference | |||||
| */ | |||||
| public RepositoryRef(Project project, Reference reference) { | |||||
| setRefid(reference); | |||||
| setProject(project); | |||||
| } | |||||
| /** | |||||
| * empty constructor | |||||
| */ | |||||
| public RepositoryRef() { | |||||
| } | |||||
| /** | |||||
| * Test for a repository being reachable. This method is called after {@link | |||||
| * #connect(GetLibraries)} is called, before any files are to be retrieved. | |||||
| * <p/> | |||||
| * If it returns false the repository considers itself offline. Similarly, | |||||
| * any ioexception is interpreted as being offline. | |||||
| * | |||||
| * @return true if the repository is online. | |||||
| * | |||||
| * @throws java.io.IOException | |||||
| */ | |||||
| public boolean checkRepositoryReachable() throws IOException { | |||||
| return false; | |||||
| } | |||||
| /** | |||||
| * fetch a library from the repository | |||||
| * | |||||
| * @param library | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| public boolean fetch(Library library) throws IOException { | |||||
| throw new BuildException("Not Implemented"); | |||||
| } | |||||
| } | |||||
| @@ -33,4 +33,5 @@ scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter | |||||
| propertyset=org.apache.tools.ant.types.PropertySet | propertyset=org.apache.tools.ant.types.PropertySet | ||||
| assertions=org.apache.tools.ant.types.Assertions | assertions=org.apache.tools.ant.types.Assertions | ||||
| concatfilter=org.apache.tools.ant.filters.ConcatFilter | concatfilter=org.apache.tools.ant.filters.ConcatFilter | ||||
| ispingable=org.apache.tools.ant.taskdefs.optional.condition.IsPingable | |||||
| ispingable=org.apache.tools.ant.taskdefs.optional.condition.IsPingable | |||||
| mavenrepository=org.apache.tools.ant.taskdefs.optional.repository.MavenRepository | |||||
| @@ -0,0 +1,109 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| import org.apache.tools.ant.taskdefs.optional.repository.GetLibraries; | |||||
| /** | |||||
| * test the test libraries stuff. | |||||
| * skip all the tests if we are offline | |||||
| */ | |||||
| public class GetLibrariesTest extends BuildFileTest { | |||||
| private final static String TASKDEFS_DIR = "src/etc/testcases/taskdefs/optional/"; | |||||
| public GetLibrariesTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject(TASKDEFS_DIR + "getlibraries.xml"); | |||||
| } | |||||
| protected boolean offline() { | |||||
| return "true".equals(System.getProperty("offline")); | |||||
| } | |||||
| public void tearDown() { | |||||
| executeTarget("cleanup"); | |||||
| } | |||||
| public void testEmpty() { | |||||
| expectBuildException("testEmpty",GetLibraries.ERROR_NO_DEST_DIR); | |||||
| } | |||||
| public void testEmpty2() { | |||||
| expectBuildException("testEmpty2", GetLibraries.ERROR_NO_REPOSITORY); | |||||
| } | |||||
| public void testEmpty3() { | |||||
| expectBuildException("testEmpty3", GetLibraries.ERROR_NO_LIBRARIES); | |||||
| } | |||||
| public void testNoRepo() { | |||||
| expectBuildException("testNoRepo", GetLibraries.ERROR_NO_REPOSITORY); | |||||
| } | |||||
| public void testUnknownReference() { | |||||
| expectBuildException("testUnknownReference", "Reference unknown not found."); | |||||
| } | |||||
| /** | |||||
| * refs are broken | |||||
| * */ | |||||
| public void testFunctionalInline() { | |||||
| if(offline()) { | |||||
| return; | |||||
| } | |||||
| executeTarget("testFunctionalInline"); | |||||
| } | |||||
| public void testMavenInline() { | |||||
| if (offline()) { | |||||
| return; | |||||
| } | |||||
| executeTarget("testMavenInline"); | |||||
| } | |||||
| public void testTwoRepositories() { | |||||
| expectBuildException("testTwoRepositories", GetLibraries.ERROR_ONE_REPOSITORY_ONLY); | |||||
| } | |||||
| public void testMavenInlineBadURL() { | |||||
| if (offline()) { | |||||
| return; | |||||
| } | |||||
| expectBuildException("testTwoRepositories", | |||||
| GetLibraries.ERROR_INCOMPLETE_RETRIEVAL); | |||||
| } | |||||
| public void testRenaming() { | |||||
| if (offline()) { | |||||
| return; | |||||
| } | |||||
| executeTarget("testRenaming"); | |||||
| } | |||||
| public void testOverwrite() { | |||||
| if (offline()) { | |||||
| return; | |||||
| } | |||||
| executeTarget("testOverwrite"); | |||||
| } | |||||
| } | |||||