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