diff --git a/ivy.xml b/ivy.xml
index 24d0f03a..bae7dc3f 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -41,17 +41,19 @@
-
+
+
+
-
+
-
+
diff --git a/optional.patterns b/optional.patterns
index cdb7cc0b..f620d72a 100644
--- a/optional.patterns
+++ b/optional.patterns
@@ -29,6 +29,7 @@ org/apache/ivy/plugins/resolver/SFTPResolver.java
org/apache/ivy/plugins/resolver/SshResolver.java
org/apache/ivy/plugins/resolver/VfsResolver.java
org/apache/ivy/plugins/resolver/VsftpResolver.java
+org/apache/ivy/plugins/resolver/packager/*.java
org/apache/ivy/util/url/HttpClientHandler.java
#This section defines the resources to copy for ivy-optional.jar
diff --git a/src/java/org/apache/ivy/plugins/resolver/packager/PackagerCacheEntry.java b/src/java/org/apache/ivy/plugins/resolver/packager/PackagerCacheEntry.java
index b7366636..f33cf173 100644
--- a/src/java/org/apache/ivy/plugins/resolver/packager/PackagerCacheEntry.java
+++ b/src/java/org/apache/ivy/plugins/resolver/packager/PackagerCacheEntry.java
@@ -17,19 +17,22 @@
*/
package org.apache.ivy.plugins.resolver.packager;
-import java.io.BufferedOutputStream;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
import org.apache.ivy.core.IvyPatternHelper;
import org.apache.ivy.core.module.descriptor.Artifact;
import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.plugins.repository.Resource;
import org.apache.ivy.plugins.resolver.util.ResolvedResource;
import org.apache.ivy.util.FileUtil;
+import org.apache.ivy.util.Message;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildLogger;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
/**
* Represents one entry in the cache of a {@link PackagerResolver}.
@@ -68,8 +71,7 @@ public class PackagerCacheEntry {
* @param packagerXML packager XML input stream
* @throws IllegalStateException if this entry has already been built
*/
- public synchronized void build(InputStream packagerXML) throws IOException {
-
+ public synchronized void build(Resource packagerResource) throws IOException {
// Sanity check
if (this.built) {
throw new IllegalStateException("build in directory `"
@@ -89,6 +91,7 @@ public class PackagerCacheEntry {
}
// Write out packager XML
+ InputStream packagerXML = packagerResource.openStream();
saveFile("packager.xml", packagerXML);
// Write packager XSLT
@@ -97,45 +100,49 @@ public class PackagerCacheEntry {
// Write packager XSD
saveFile("packager-1.0.xsd");
- // Write master ant build file
+ // Write master Ant build file
saveFile("build.xml");
- // Create new process argument list
- ArrayList paramList = new ArrayList();
- paramList.add("ant");
- if (this.verbose) {
- paramList.add("-verbose");
- }
- if (this.quiet) {
- paramList.add("-quiet");
- }
- paramList.add("-Divy.packager.organisation=" + this.mr.getModuleId().getOrganisation());
- paramList.add("-Divy.packager.module=" + this.mr.getModuleId().getName());
- paramList.add("-Divy.packager.revision=" + this.mr.getRevision());
- paramList.add("-Divy.packager.branch=" + this.mr.getBranch());
+ // Execute the Ant build file
+ Project project = new Project();
+ project.init();
+ project.setUserProperty("ant.file" , new File(dir, "build.xml").getAbsolutePath());
+ ProjectHelper.configureProject(project, new File(dir, "build.xml"));
+ project.setBaseDir(dir);
+
+ // Configure logging verbosity
+ BuildLogger logger = new DefaultLogger();
+ logger.setMessageOutputLevel(this.verbose ? Project.MSG_VERBOSE :
+ this.quiet ? Project.MSG_WARN : Project.MSG_INFO);
+ logger.setOutputPrintStream(System.out);
+ logger.setErrorPrintStream(System.err);
+ project.addBuildListener(logger);
+
+ // Set properties
+ project.setUserProperty("ivy.packager.organisation", "" + this.mr.getModuleId().getOrganisation());
+ project.setUserProperty("ivy.packager.module", "" + this.mr.getModuleId().getName());
+ project.setUserProperty("ivy.packager.revision", "" + this.mr.getRevision());
+ project.setUserProperty("ivy.packager.branch", "" + this.mr.getBranch());
if (this.resourceCache != null) {
- paramList.add("-Divy.packager.resourceCache=" + this.resourceCache.getCanonicalPath());
+ project.setUserProperty("ivy.packager.resourceCache", "" + this.resourceCache.getCanonicalPath());
}
if (this.resourceURL != null) {
- paramList.add("-Divy.packager.resourceURL=" + getResourceURL());
+ project.setUserProperty("ivy.packager.resourceURL", "" + getResourceURL());
}
if (this.validate) {
- paramList.add("-Divy.packager.validate=true");
+ project.setUserProperty("ivy.packager.validate", "true");
}
- String[] params = (String[]) paramList.toArray(new String[paramList.size()]);
-
- // Run ant
- SubProcess proc = new SubProcess(params, null, this.dir);
- int result;
+
+ // Execute task
+ Message.verbose("performing packager resolver build in " + this.dir);
try {
- result = proc.run();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
+ project.executeTarget("build");
+ this.built = true;
+ } catch (BuildException e) {
+ e.printStackTrace(System.out);
+ Message.verbose("packager resolver build failed: " + e);
+ throw e;
}
- if (result != 0) {
- throw new IOException("build in directory `" + this.dir + "' failed");
- }
- this.built = true;
}
/**
@@ -166,11 +173,7 @@ public class PackagerCacheEntry {
}
protected void saveFile(String name, InputStream input) throws IOException {
- OutputStream out = new BufferedOutputStream(
- new FileOutputStream(new File(this.dir, name)));
- SubProcess.relayStream(input, out);
- input.close();
- out.close();
+ FileUtil.copy(input, new File(this.dir, name), null);
}
protected void saveFile(String name) throws IOException {
diff --git a/src/java/org/apache/ivy/plugins/resolver/packager/PackagerResolver.java b/src/java/org/apache/ivy/plugins/resolver/packager/PackagerResolver.java
index d6d06b36..e5022f16 100644
--- a/src/java/org/apache/ivy/plugins/resolver/packager/PackagerResolver.java
+++ b/src/java/org/apache/ivy/plugins/resolver/packager/PackagerResolver.java
@@ -55,7 +55,7 @@ public class PackagerResolver extends URLResolver {
private boolean preserve;
private boolean verbose;
private boolean quiet;
-
+
public PackagerResolver() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
@@ -63,7 +63,7 @@ public class PackagerResolver extends URLResolver {
}
});
}
-
+
protected synchronized void clearCache() {
if (this.preserve) {
return;
@@ -190,7 +190,7 @@ public class PackagerResolver extends URLResolver {
entry = new PackagerCacheEntry(mr, this.buildRoot, this.resourceCache,
this.resourceURL, this.validate, this.preserve, this.verbose, this.quiet);
try {
- entry.build(packager.getResource().openStream());
+ entry.build(packager.getResource());
} catch (IOException e) {
throw new RuntimeException("can't build artifact " + artifact, e);
}
diff --git a/src/java/org/apache/ivy/plugins/resolver/packager/SubProcess.java b/src/java/org/apache/ivy/plugins/resolver/packager/SubProcess.java
deleted file mode 100644
index fa960bda..00000000
--- a/src/java/org/apache/ivy/plugins/resolver/packager/SubProcess.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.ivy.plugins.resolver.packager;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Simple utility class for executing subprocesses. Handles I/O streams
- * by closing standard input and relaying standard output and error.
- */
-public class SubProcess {
-
- private static final int BUFSIZE = 1024;
-
- private final String[] cmd;
- private final String[] env;
- private final File dir;
-
- /**
- * Constructor.
- *
- * @param cmd command parameters
- * @param env command environment
- * @param dir command working directory
- * @see Runtime.exec(String[], String[], File)
- */
- public SubProcess(String[] cmd, String[] env, File dir) {
- this.cmd = cmd;
- this.env = env;
- this.dir = dir;
- }
-
- /**
- * Execute the process and wait for it to complete.
- *
- * @return exit value from process
- */
- public int run() throws IOException, InterruptedException {
- Process proc = Runtime.getRuntime().exec(this.cmd, this.env, this.dir);
- proc.getOutputStream().close();
- Thread relay1 = startRelay(proc.getInputStream(), System.out);
- Thread relay2 = startRelay(proc.getErrorStream(), System.err);
- int result;
- relay1.join();
- relay2.join();
- return proc.waitFor();
- }
-
- /**
- * Create and start a separate thread that copies input to output and closes
- * the input when done.
- *
- * @param in input stream to read from
- * @param out output stream to copy to
- * @return thread doing the work
- */
- public static Thread startRelay(final InputStream in, final OutputStream out) {
- Thread thread = new Thread() {
- public void run() {
- try {
- relayStream(in, out);
- in.close();
- } catch (IOException e) {
- return;
- }
- }
- };
- thread.setDaemon(true);
- thread.start();
- return thread;
- }
-
- /**
- * Copy from input to output. Does not close either stream when finished.
- *
- * @param in input stream to read from
- * @param out output stream to copy to
- */
- public static void relayStream(InputStream in, OutputStream out) throws IOException {
- byte[] buf = new byte[BUFSIZE];
- int r;
- while ((r = in.read(buf)) != -1) {
- out.write(buf, 0, r);
- }
- out.flush();
- }
-}
-
diff --git a/src/java/org/apache/ivy/plugins/resolver/packager/packager.xsl b/src/java/org/apache/ivy/plugins/resolver/packager/packager.xsl
index ce5e9578..9084765e 100644
--- a/src/java/org/apache/ivy/plugins/resolver/packager/packager.xsl
+++ b/src/java/org/apache/ivy/plugins/resolver/packager/packager.xsl
@@ -126,7 +126,7 @@
-
+
diff --git a/test/java/org/apache/ivy/plugins/resolver/PackagerResolverTest.java b/test/java/org/apache/ivy/plugins/resolver/PackagerResolverTest.java
index 3b59f954..8d368f01 100644
--- a/test/java/org/apache/ivy/plugins/resolver/PackagerResolverTest.java
+++ b/test/java/org/apache/ivy/plugins/resolver/PackagerResolverTest.java
@@ -35,8 +35,11 @@ import org.apache.ivy.core.resolve.ResolveOptions;
import org.apache.ivy.core.resolve.ResolvedModuleRevision;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.core.sort.SortEngine;
+import org.apache.ivy.plugins.resolver.packager.PackagerProperty;
import org.apache.ivy.plugins.resolver.packager.PackagerResolver;
+import org.apache.ivy.util.DefaultMessageLogger;
import org.apache.ivy.util.FileUtil;
+import org.apache.ivy.util.Message;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Copy;
import org.apache.tools.ant.types.FileSet;
@@ -61,7 +64,9 @@ public class PackagerResolverTest extends AbstractDependencyResolverTest {
private File _websitedir;
protected void setUp() throws Exception {
+
_settings = new IvySettings();
+ Message.setDefaultLogger(new DefaultMessageLogger(99));
_engine = new ResolveEngine(_settings, new EventManager(), new SortEngine(_settings));
_cache = new File("build/cache");
_data = new ResolveData(_engine, new ResolveOptions());
@@ -104,12 +109,15 @@ public class PackagerResolverTest extends AbstractDependencyResolverTest {
resolver.setSettings(_settings);
File repoRoot = new File("test/repositories/packager/repo");
resolver.addIvyPattern(
- "" + new File(repoRoot, "[organisation]/[module]/[revision]/ivy.xml").toURL());
+ "" + new File(repoRoot, "[organisation]/[module]/[revision]/ivy.xml").getAbsoluteFile().toURL().toExternalForm());
resolver.setPackagerPattern(
- "" + new File(repoRoot, "[organisation]/[module]/[revision]/packager.xml").toURL());
+ "" + new File(repoRoot, "[organisation]/[module]/[revision]/packager.xml").getAbsoluteFile().toURL().toExternalForm());
resolver.setBuildRoot(_builddir.getAbsolutePath());
resolver.setResourceCache(_cachedir.getAbsolutePath());
resolver.setPreserveBuildDirectories(true);
+ resolver.setVerbose(true);
+
+ System.setProperty("packager.website.url", new File("test/repositories/packager/website").getAbsoluteFile().toURL().toExternalForm());
resolver.setName("packager");
assertEquals("packager", resolver.getName());
@@ -132,6 +140,7 @@ public class PackagerResolverTest extends AbstractDependencyResolverTest {
assertEquals(1, report.getArtifactsReports().length);
ArtifactDownloadReport ar = report.getArtifactReport(artifact);
+ System.out.println("downloaddetails: " + ar.getDownloadDetails());
assertNotNull(ar);
assertEquals(artifact, ar.getArtifact());
diff --git a/test/repositories/packager/repo/org/mod/1.0/packager.xml b/test/repositories/packager/repo/org/mod/1.0/packager.xml
index a4910cea..579aa445 100644
--- a/test/repositories/packager/repo/org/mod/1.0/packager.xml
+++ b/test/repositories/packager/repo/org/mod/1.0/packager.xml
@@ -21,12 +21,12 @@
-
-
+