Browse Source

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.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276982 13f79535-47bb-0310-9956-ffa450edef68
master
Steve Loughran 20 years ago
parent
commit
844ca96965
5 changed files with 342 additions and 31 deletions
  1. +52
    -3
      src/etc/testcases/taskdefs/optional/getlibraries.xml
  2. +134
    -8
      src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java
  3. +6
    -1
      src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java
  4. +127
    -6
      src/main/org/apache/tools/ant/taskdefs/optional/repository/Library.java
  5. +23
    -13
      src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java

+ 52
- 3
src/etc/testcases/taskdefs/optional/getlibraries.xml View File

@@ -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: ${lib.dir}@{library}
</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>


+ 134
- 8
src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java View File

@@ -19,13 +19,16 @@ 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.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 @@ public class GetLibraries extends Task {

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,18 +177,47 @@ public class GetLibraries extends Task {
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
*
@@ -208,17 +247,17 @@ public class GetLibraries extends Task {
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 @@ public class GetLibraries extends Task {
}

//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 @@ public class GetLibraries extends Task {

//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 @@ public class GetLibraries extends Task {
//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
@@ -312,4 +358,84 @@ public class GetLibraries extends Task {
}
}

/**
* 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();
}
}


}

+ 6
- 1
src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java View File

@@ -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;


+ 127
- 6
src/main/org/apache/tools/ant/taskdefs/optional/repository/Library.java View File

@@ -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 @@ public class Library {

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 @@ public class Library {
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 @@ public class Library {
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 @@ public class Library {
faultIfEmpty(version, ERROR_NO_SUFFIX);
}

/**
* string is for debug
* @return
*/
public String toString() {
return "Library " + getNormalFilename()
+ " from project " + project
@@ -139,9 +232,10 @@ public class Library {
}

/**
* calculare the destination file of a library
* calculate the destination file of a library; set {@link #libraryFile}
* to the File thereof.
*
* @param baseDir
* @param baseDir dir that
*
* @throws BuildException if invalid
*/
@@ -154,7 +248,8 @@ public class Library {
}

/**
* a test that is only valid after binding
* Test for a library
* only valid after binding
*
* @return
*/
@@ -164,7 +259,7 @@ public class Library {

/**
* get the last modified date
*
* only valid after binding
* @return
*/
public long getLastModified() {
@@ -215,4 +310,30 @@ public class Library {
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());
}


}

+ 23
- 13
src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java View File

@@ -67,17 +67,19 @@ public class GetLibrariesTest extends BuildFileTest {
* 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 class GetLibrariesTest extends BuildFileTest {
}

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");
}

}

Loading…
Cancel
Save