stevel 2004/10/30 14:03:44 Modified: src/etc/testcases/taskdefs/optional getlibraries.xml src/main/org/apache/tools/ant/taskdefs/optional/repository GetLibraries.java HttpRepository.java Library.java src/testcases/org/apache/tools/ant/taskdefs/optional/repository GetLibrariesTest.java Log: merging features of Russell's dependencies contribution; conditional dependencies and setting of a path to the dependency list. Moving from httpclient to get is still todo. Revision Changes Path 1.2 +52 -3 ant/src/etc/testcases/taskdefs/optional/getlibraries.xml Index: getlibraries.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/getlibraries.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- getlibraries.xml 25 Oct 2004 23:13:39 -0000 1.1 +++ getlibraries.xml 30 Oct 2004 21:03:44 -0000 1.2 @@ -1,5 +1,5 @@ <?xml version="1.0"?> -<project name="getlibraries" basedir="." default="all"> +<project name="getlibraries" basedir="." default="init"> <!-- use the normal one at ibiblio--> @@ -10,12 +10,17 @@ <mkdir dir="${lib.dir}"/> <property name="commons.logging" value="commons-logging-1.0.1.jar"/> - <presetdef name="getlib"> + <presetdef name="gl1"> <getlibraries destDir="${lib.dir}"> - <library archive="commons-logging" project="commons-logging" version="1.0.1"/> </getlibraries> </presetdef> + <presetdef name="getlib"> + <gl1 destDir="${lib.dir}"> + <library archive="commons-logging" project="commons-logging" version="1.0.1"/> + </gl1> + </presetdef> + <macrodef name="assert-downloaded"> <attribute name="library" default="${commons.logging}"/> <sequential> @@ -26,6 +31,18 @@ </fail> </sequential> </macrodef> + + <macrodef name="assert-not-downloaded"> + <attribute name="library" default="${commons.logging}"/> + <sequential> + <available property="@{library}.exists" + file="${lib.dir}/@{library}"/> + <fail if="@{library}.exists"> + Found: [EMAIL PROTECTED] + </fail> + </sequential> + </macrodef> + </target> <target name="cleanup"> @@ -108,5 +125,37 @@ </getlib> </target> + <target name="testIf" depends="init"> + <property name="trueProp" value="true" /> + <gl1> + <mavenrepository/> + <library archive="commons-logging" project="commons-logging" version="1.0.1" + if="trueProp"/> + </gl1> + <assert-downloaded/> + </target> + + <target name="testUnless" depends="init"> + <gl1> + <mavenrepository/> + <library archive="commons-logging" project="commons-logging" version="1.0.1" + if="undefinedProp"/> + </gl1> + <assert-not-downloaded/> + </target> + + <target name="testPathID" depends="init"> + <getlib pathid="commons.logging"> + <mavenrepository/> + </getlib> + <available + property="logging.found" + classname="org.apache.commons.logging.Log" + classpathref="commons.logging" + ignoresystemclasses="true" /> + <fail unless="logging.found"> + Did not find commons logging in the path + </fail> + </target> </project> 1.2 +134 -8 ant/src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java Index: GetLibraries.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- GetLibraries.java 25 Oct 2004 23:13:38 -0000 1.1 +++ GetLibraries.java 30 Oct 2004 21:03:44 -0000 1.2 @@ -19,13 +19,16 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import java.io.File; import java.io.IOException; +import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.NoSuchElementException; /** * This task will retrieve one or more libraries from a repository. <ol> @@ -64,6 +67,13 @@ private Repository repository; + /** + * Optional. A name for a path to define from the dependencies specified. + */ + private String pathid; + + + 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"; @@ -167,19 +177,48 @@ return destDir; } + /** + * get fore download flag + * @return + */ public boolean isForceDownload() { return forceDownload; } + /** + * get the list of libraries + * @return + */ public List getLibraries() { return libraries; } + /** + * get our repository + * @return + */ public Repository getRepository() { return repository; } /** + * get the pathID if defined + * @return + */ + public String getPathid() { + return pathid; + } + + /** + * the name of a path reference to be created referring + * to the libraries. + * @param pathid + */ + public void setPathid(String pathid) { + this.pathid = pathid; + } + + /** * validate ourselves * * @throws BuildException @@ -208,17 +247,17 @@ validate(); Repository repo = repository.resolve(); repo.validate(); - int toFetch = libraries.size(); - if (toFetch == 0) { + if (libraries.size() == 0) { throw new BuildException(ERROR_NO_LIBRARIES); } - int fetched = 0; + int failures = 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\""); + //when offline, we just make sure everything is in place verifyAllLibrariesPresent(); return; } @@ -250,18 +289,19 @@ } //iterate through the libs we have - Iterator it = libraries.iterator(); + Iterator it = filteredIterator(); while (it.hasNext()) { Library library = (Library) it.next(); - library.bind(destDir); try { + //fetch it 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); + //add failures + failures++; } } } finally { @@ -270,12 +310,18 @@ //at this point downloads have finished. //we do still need to verify that everything worked. - if ((fetched < toFetch && forceDownload)) { + if ((failures>0 && forceDownload)) { throw new BuildException(ERROR_FORCED_DOWNLOAD_FAILED); } + //validate the download verifyAllLibrariesPresent(); + //create the path + if(pathid!=null) { + createPath(); + } + } /** @@ -296,7 +342,7 @@ //iterate through the libs we have boolean missing = false; - Iterator it = libraries.iterator(); + Iterator it = filteredIterator(); while (it.hasNext()) { Library library = (Library) it.next(); //check for the library existing @@ -311,5 +357,85 @@ throw new BuildException(ERROR_INCOMPLETE_RETRIEVAL); } } + + /** + * create a path; requires pathID!=null + */ + private void createPath() { + Path path = new Path(getProject()); + for (Iterator iterator = filteredIterator(); + iterator.hasNext();) { + ((Library) iterator.next()).appendToPath(path); + } + getProject().addReference(pathid, path); + } + + /** + * get a filtered iterator of the dependencies + * @return a new iterator that ignores disabled libraries + */ + protected Iterator filteredIterator() { + return new LibraryIterator(libraries,getProject()); + } + + /** + * iterator through a list that skips everything that + * is not enabled + */ + private static class LibraryIterator implements Iterator { + private Iterator _underlyingIterator; + private Library _next; + private Project _project; + + + /** + * constructor + * @param collection + * @param project + */ + LibraryIterator(Collection collection, Project project) { + _project = project; + _underlyingIterator = collection.iterator(); + } + + + /** + * test for having another enabled component + * @return + */ + public boolean hasNext() { + while (_next == null && _underlyingIterator.hasNext()) { + Library candidate = (Library) _underlyingIterator.next(); + if (candidate.isEnabled(_project)) { + _next = candidate; + } + } + return (_next != null); + } + + + /** + * get the next element + * @return + */ + public Object next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + Library result = _next; + _next = null; + return result; + } + + + /** + * removal is not supported + * @throws UnsupportedOperationException always + */ + public void remove() { + throw new UnsupportedOperationException(); + } + } + } 1.2 +6 -1 ant/src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java Index: HttpRepository.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- HttpRepository.java 25 Oct 2004 23:13:38 -0000 1.1 +++ HttpRepository.java 30 Oct 2004 21:03:44 -0000 1.2 @@ -16,7 +16,12 @@ */ package org.apache.tools.ant.taskdefs.optional.repository; -import org.apache.commons.httpclient.*; +import org.apache.commons.httpclient.Credentials; +import org.apache.commons.httpclient.DefaultMethodRetryHandler; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.tools.ant.BuildException; 1.2 +127 -6 ant/src/main/org/apache/tools/ant/taskdefs/optional/repository/Library.java Index: Library.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/repository/Library.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Library.java 25 Oct 2004 23:13:38 -0000 1.1 +++ Library.java 30 Oct 2004 21:03:44 -0000 1.2 @@ -18,13 +18,15 @@ 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.Path; import java.io.File; /** * How we represent libraries * - * @since 20-Oct-2004 + * @since Ant1.7 */ public class Library { @@ -44,8 +46,21 @@ private String destinationName; + /** + * file mapped to this one + */ private File libraryFile; + /** + * if clause + */ + private String ifClause; + + /** + * unless clause + */ + private String unlessClause; + 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"; @@ -57,40 +72,73 @@ private String suffix = "jar"; + /** + * the project that provides this library + * @return the project or null + */ public String getProject() { return project; } + /** + * the project that provides this library + * @param project + */ public void setProject(String project) { this.project = project; } + /** + * Get the version string of this library + * @return + */ public String getVersion() { return version; } + /** + * set the version string of this library + * @param version + */ public void setVersion(String version) { this.version = version; } + /** + * get the base name of this library + * @return + */ public String getArchive() { return archive; } + /** + * set the base name of this library + * @param archive + */ public void setArchive(String archive) { this.archive = archive; } + /** + * get the destination name attribute. + * @return + */ public String getDestinationName() { return destinationName; } + /** + * set the name of the library when downloaded, + * relative to the base directory + * @param destinationName + */ public void setDestinationName(String destinationName) { this.destinationName = destinationName; } /** - * get the suffix for this file. + * get the suffix for this file. * * @return */ @@ -98,10 +146,51 @@ return suffix; } + /** + * set the suffix for this file; default is "jar" + * @param suffix + */ public void setSuffix(String suffix) { this.suffix = suffix; } + /** + * a property that must be set for the library to be considered a dependency + * @return + */ + public String getIf() { + return ifClause; + } + + /** + * a property that must be set for the library to be considered a dependency + * @param ifClause + */ + public void setIf(String ifClause) { + this.ifClause = ifClause; + } + + /** + * a property that must be unset for the library to be considered a dependency + * @return + */ + public String getUnless() { + return unlessClause; + } + + /** + * a property that must be unset for the library to be considered a dependency + * @param unlessClause + */ + public void setUnless(String unlessClause) { + this.unlessClause = unlessClause; + } + + /** + * get the library file + * (only non-null after binding) + * @return library file or null + */ public File getLibraryFile() { return libraryFile; } @@ -132,6 +221,10 @@ faultIfEmpty(version, ERROR_NO_SUFFIX); } + /** + * string is for debug + * @return + */ public String toString() { return "Library " + getNormalFilename() + " from project " + project @@ -139,9 +232,10 @@ } /** - * calculare the destination file of a library + * calculate the destination file of a library; set [EMAIL PROTECTED] #libraryFile} + * to the File thereof. * - * @param baseDir + * @param baseDir dir that * * @throws BuildException if invalid */ @@ -154,7 +248,8 @@ } /** - * a test that is only valid after binding + * Test for a library + * only valid after binding * * @return */ @@ -164,7 +259,7 @@ /** * get the last modified date - * + * only valid after binding * @return */ public long getLastModified() { @@ -214,5 +309,31 @@ public String getAbsolutePath() { return libraryFile.getAbsolutePath(); } + + /** + * test for being enabled + * @param project + * @return + */ + public boolean isEnabled(Project project) { + if (unlessClause != null && project.getProperty(unlessClause) != null) { + return false; + } + if (ifClause == null) { + return true; + } + return project.getProperty(ifClause) != null; + } + + + /** + * add our location to a filepath + * @param path + */ + public void appendToPath(Path path) { + Path.PathElement pathElement = path.createPathElement(); + pathElement.setLocation(getLibraryFile()); + } + } 1.3 +23 -13 ant/src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java Index: GetLibrariesTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- GetLibrariesTest.java 28 Oct 2004 12:23:56 -0000 1.2 +++ GetLibrariesTest.java 30 Oct 2004 21:03:44 -0000 1.3 @@ -67,17 +67,19 @@ * refs are broken * */ public void NotestFunctionalInline() { - if(offline()) { - return; - } - executeTarget("testFunctionalInline"); + execIfOnline("testFunctionalInline"); } public void testMavenInline() { + String targetName = "testMavenInline"; + execIfOnline(targetName); + } + + private void execIfOnline(String targetName) { if (offline()) { return; } - executeTarget("testMavenInline"); + executeTarget(targetName); } public void testTwoRepositories() { @@ -93,16 +95,24 @@ } public void testRenaming() { - if (offline()) { - return; - } - executeTarget("testRenaming"); + execIfOnline("testRenaming"); + } public void testOverwrite() { - if (offline()) { - return; - } - executeTarget("testOverwrite"); + execIfOnline("testOverwrite"); } + + public void testIf() { + execIfOnline("testIf"); + } + + public void testUnless() { + execIfOnline("testUnless"); + } + + public void testPathID() { + execIfOnline("testPathID"); + } + }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]