You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2012/08/21 15:58:37 UTC

svn commit: r1375549 - in /ant/ivy/core/trunk: src/java/org/apache/ivy/core/cache/ src/java/org/apache/ivy/core/report/ src/java/org/apache/ivy/core/retrieve/ src/java/org/apache/ivy/plugins/report/ src/java/org/apache/ivy/util/ test/java/org/apache/iv...

Author: hibou
Date: Tue Aug 21 13:58:36 2012
New Revision: 1375549

URL: http://svn.apache.org/viewvc?rev=1375549&view=rev
Log:
Add support for retrieve of uncompressed artifacts

Modified:
    ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveOptions.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java Tue Aug 21 13:58:36 2012
@@ -928,9 +928,7 @@ public class DefaultRepositoryCacheManag
         }
 
         // the artifact for the folder of the uncompressed data
-        DefaultArtifact uncompressed = new DefaultArtifact(artifact.getModuleRevisionId(),
-                artifact.getPublicationDate(), artifact.getName(), "_uncompressed", "");
-        adr.setUncompressedArtifact(uncompressed);
+        Artifact uncompressed = adr.buildUncompressedArtifact();
 
         File archiveFile = getArchiveFileInCache(uncompressed, null, false);
         if (archiveFile.exists() && !options.isForce()) {

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java Tue Aug 21 13:58:36 2012
@@ -21,6 +21,7 @@ import java.io.File;
 
 import org.apache.ivy.core.cache.ArtifactOrigin;
 import org.apache.ivy.core.module.descriptor.Artifact;
+import org.apache.ivy.core.module.descriptor.DefaultArtifact;
 
 /**
  * Report on the download of an artifact from a repository to a local (cached) file.
@@ -57,8 +58,6 @@ public class ArtifactDownloadReport {
 
     private File uncompressedLocalDir;
 
-    private Artifact uncompressedArtifact;
-
     public ArtifactDownloadReport(Artifact artifact) {
         this.artifact = artifact;
     }
@@ -159,12 +158,9 @@ public class ArtifactDownloadReport {
         return DownloadStatus.SUCCESSFUL == downloadStatus;
     }
 
-    public void setUncompressedArtifact(Artifact uncompressedArtifact) {
-        this.uncompressedArtifact = uncompressedArtifact;
-    }
-
-    public Artifact getUncompressedArtifact() {
-        return uncompressedArtifact;
+    public Artifact buildUncompressedArtifact() {
+        return new DefaultArtifact(artifact.getModuleRevisionId(), artifact.getPublicationDate(),
+                artifact.getName(), "_uncompressed", "");
     }
 
     public void setUncompressedLocalDir(File uncompressedLocalDir) {

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java Tue Aug 21 13:58:36 2012
@@ -111,6 +111,7 @@ public class RetrieveEngine {
 
         try {
             Map/*<File, File>*/ destToSrcMap = null;
+            // Map<ArtifactDownloadReport, Set<String>>
             Map artifactsToCopy = determineArtifactsToCopy(mrid, destFilePattern, options);
             File fileRetrieveRoot = settings.resolveFile(
                 IvyPatternHelper.getTokenRoot(destFilePattern));
@@ -134,6 +135,9 @@ public class RetrieveEngine {
             for (Iterator iter = artifactsToCopy.keySet().iterator(); iter.hasNext();) {
                 ArtifactDownloadReport artifact = (ArtifactDownloadReport) iter.next();
                 File archive = artifact.getLocalFile();
+                if (options.isUncompressed() && artifact.getUncompressedLocalDir() != null) {
+                    archive = artifact.getUncompressedLocalDir();
+                }
                 if (archive == null) {
                     Message.verbose("\tno local file available for " + artifact + ": skipping");
                     continue;
@@ -170,7 +174,7 @@ public class RetrieveEngine {
                                         artifact, destFile));
                             }
                         }
-                        totalCopiedSize += destFile.length();
+                        totalCopiedSize += FileUtil.getFileLength(destFile);
                         report.addCopiedFile(destFile, artifact);
                     } else {
                         Message.verbose("\t\tto " + destFile + " [NOT REQUIRED]");
@@ -288,6 +292,9 @@ public class RetrieveEngine {
         }
     }
 
+    /**
+     * @return Map<ArtifactDownloadReport, Set<String>>
+     */
     public Map determineArtifactsToCopy(ModuleRevisionId mrid, String destFilePattern,
             RetrieveOptions options) throws ParseException, IOException {
         ModuleId moduleId = mrid.getModuleId();
@@ -328,22 +335,27 @@ public class RetrieveEngine {
                 }
             }
             for (Iterator iter = artifacts.iterator(); iter.hasNext();) {
-                ArtifactDownloadReport artifact = (ArtifactDownloadReport) iter.next();
-                String destPattern = "ivy".equals(artifact.getType()) ? destIvyPattern
+                ArtifactDownloadReport adr = (ArtifactDownloadReport) iter.next();
+
+                Artifact artifact = adr.getArtifact();
+                if (options.isUncompressed() && adr.getUncompressedLocalDir() != null) {
+                    artifact = adr.buildUncompressedArtifact();
+                }
+
+                String destPattern = "ivy".equals(adr.getType()) ? destIvyPattern
                         : destFilePattern;
                 
-                if (!"ivy".equals(artifact.getType())
-                        && !options.getArtifactFilter().accept(artifact.getArtifact())) {
+                if (!"ivy".equals(adr.getType())
+                        && !options.getArtifactFilter().accept(adr.getArtifact())) {
                     continue; // skip this artifact, the filter didn't accept it!
                 }
 
                 String destFileName = IvyPatternHelper.substitute(destPattern,
-                            artifact.getArtifact().getModuleRevisionId(), artifact.getArtifact(),
-                            conf, artifact.getArtifactOrigin());
-                Set dest = (Set) artifactsToCopy.get(artifact);
+                    artifact.getModuleRevisionId(), artifact, conf, adr.getArtifactOrigin());
+                Set dest = (Set) artifactsToCopy.get(adr);
                 if (dest == null) {
                     dest = new HashSet();
-                    artifactsToCopy.put(artifact, dest);
+                    artifactsToCopy.put(adr, dest);
                 }
                 String copyDest = settings.resolveFile(destFileName).getAbsolutePath();
 
@@ -370,8 +382,8 @@ public class RetrieveEngine {
                         conflictsConf = new HashSet();
                         conflictsConfMap.put(destinations[j], conflictsConf);
                     }
-                    if (conflicts.add(artifact.getArtifact().getId())) {
-                        conflictsReports.add(artifact);
+                    if (conflicts.add(artifact.getId())) {
+                        conflictsReports.add(adr);
                         conflictsConf.add(conf);
                     }
                 }

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveOptions.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveOptions.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveOptions.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveOptions.java Tue Aug 21 13:58:36 2012
@@ -86,6 +86,7 @@ public class RetrieveOptions extends Log
     private String resolveId;
     
     private FileNameMapper mapper;
+    private boolean uncompressed;
 
     public RetrieveOptions() {
     }
@@ -103,6 +104,7 @@ public class RetrieveOptions extends Log
         this.makeSymlinksInMass = options.makeSymlinksInMass;
         this.resolveId = options.resolveId;
         this.mapper = options.mapper;
+        this.uncompressed = options.uncompressed;
     }
 
     public String getDestArtifactPattern() {
@@ -203,5 +205,13 @@ public class RetrieveOptions extends Log
         this.mapper = mapper;
         return this;
     }
-    
+
+    public boolean isUncompressed() {
+        return uncompressed;
+    }
+
+    public RetrieveOptions setUncompressed(boolean uncompressed) {
+        this.uncompressed = uncompressed;
+        return this;
+    }
 }

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java Tue Aug 21 13:58:36 2012
@@ -168,6 +168,10 @@ public class XmlReportParser {
                     if (attributes.getValue("location") != null) {
                         aReport.setLocalFile(new File(attributes.getValue("location")));
                     }
+                    if (attributes.getValue("uncompressedDir") != null) {
+                        aReport.setUncompressedLocalDir(new File(attributes
+                                .getValue("uncompressedDir")));
+                    }
                     revisionArtifacts.add(aReport);
                 } else if ("origin-location".equals(qName)) {
                     if (skip) {

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java Tue Aug 21 13:58:36 2012
@@ -302,6 +302,11 @@ public class XmlReportWriter {
                 out.print(" location=\"" 
                     + XMLHelper.escape(adr[i].getLocalFile().getAbsolutePath()) + "\"");
             }
+            if (adr[i].getUncompressedLocalDir() != null) {
+                out.print(" uncompressedDir=\""
+                        + XMLHelper.escape(adr[i].getUncompressedLocalDir().getAbsolutePath())
+                        + "\"");
+            }
 
             ArtifactOrigin origin = adr[i].getArtifactOrigin();
             if (origin != null) {

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java Tue Aug 21 13:58:36 2012
@@ -25,10 +25,9 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -169,6 +168,17 @@ public final class FileUtil {
     }
 
     public static boolean prepareCopy(File src, File dest, boolean overwrite) throws IOException {
+        if (src.isDirectory()) {
+            if (dest.exists()) {
+                if (!dest.isDirectory()) {
+                    throw new IOException("impossible to copy: destination is not a directory: " + dest);
+                }
+            } else {
+                dest.mkdirs();
+            }
+            return true;
+        }
+        // else it is a file copy
         if (dest.exists()) {
             if (!dest.isFile()) {
                 throw new IOException("impossible to copy: destination is not a file: " + dest);
@@ -193,6 +203,10 @@ public final class FileUtil {
         if (!prepareCopy(src, dest, overwrite)) {
             return false;
         }
+        if (src.isDirectory()) {
+            return deepCopy(src, dest, l, overwrite);
+        }
+        // else it is a file copy
         copy(new FileInputStream(src), dest, l);
         long srcLen = src.length();
         long destLen = dest.length();
@@ -206,6 +220,50 @@ public final class FileUtil {
         return true;
     }
 
+    public static boolean deepCopy(File src, File dest, CopyProgressListener l, boolean overwrite)
+            throws IOException {
+        // the list of files which already exist in the destination folder
+        List/* <File> */existingChild = Collections.EMPTY_LIST;
+        if (dest.exists()) {
+            if (!dest.isDirectory()) {
+                // not expected type, remove
+                dest.delete();
+                // and create a folder
+                dest.mkdirs();
+                dest.setLastModified(src.lastModified());
+            } else {
+                // existing folder, gather existing children
+                File[] children = dest.listFiles();
+                if (children != null) {
+                    existingChild = Arrays.asList(children);
+                }
+            }
+        } else {
+            dest.mkdirs();
+            dest.setLastModified(src.lastModified());
+        }
+        // copy files one by one
+        File[] toCopy = src.listFiles();
+        if (toCopy != null) {
+            for (int i = 0; i < toCopy.length; i++) {
+                // compute the destination file
+                File childDest = new File(dest, toCopy[i].getName());
+                // if file existing, 'mark' it as taken care of
+                existingChild.remove(childDest);
+                if (toCopy[i].isDirectory()) {
+                    deepCopy(toCopy[i], childDest, l, overwrite);
+                } else {
+                    copy(toCopy[i], childDest, l, overwrite);
+                }
+            }
+        }
+        // some file exist in the destination but not in the source: delete them
+        for (int i = 0; i < existingChild.size(); i++) {
+            forceDelete((File) existingChild.get(i));
+        }
+        return true;
+    }
+
     public static void copy(URL src, File dest, CopyProgressListener l) throws IOException {
         URLHandlerRegistry.getDefault().download(src, dest, l);
     }
@@ -548,7 +606,27 @@ public final class FileUtil {
         }
         return new String[] {root, path};
     }
- 
+
+    /**
+     * Get the length of the file, or the sum of the children lengths if it is a directory
+     * 
+     * @param file
+     * @return
+     */
+    public static long getFileLength(File file) {
+        long l = 0;
+        if (file.isDirectory()) {
+            File[] files = file.listFiles();
+            if (files != null) {
+                for (int i = 0; i < files.length; i++) {
+                    l += getFileLength(files[i]);
+                }
+            }
+        } else {
+            l = file.length();
+        }
+        return l;
+    }
 
 
 }

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java?rev=1375549&r1=1375548&r2=1375549&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java Tue Aug 21 13:58:36 2012
@@ -19,6 +19,7 @@ package org.apache.ivy.core.retrieve;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -305,6 +306,35 @@ public class RetrieveTest extends TestCa
         assertEquals(3, artifactsToCopy.size());
     }
 
+    public void testUncompress() throws Exception {
+        ResolveOptions roptions = getResolveOptions(new String[] {"*"});
+        roptions.setExpandCompressed(true);
+
+        URL url = new File("test/repositories/1/compression/module1/ivys/ivy-1.0.xml").toURI()
+                .toURL();
+
+        // normal resolve, the file goes in the cache
+        ResolveReport report = ivy.resolve(url, roptions);
+        assertFalse(report.hasError());
+        ModuleDescriptor md = report.getModuleDescriptor();
+        assertNotNull(md);
+
+        String pattern = "build/test/retrieve/[organization]/[module]/[conf]/[artifact]-[revision](.[ext])";
+
+        RetrieveOptions options = getRetrieveOptions();
+        options.setUncompressed(true);
+        ivy.retrieve(md.getModuleRevisionId(), pattern, options);
+
+        // NB
+        File dest = new File("build/test/retrieve/compression/module2/default/module2-1.0");
+        assertTrue(dest.exists());
+        assertTrue(dest.isDirectory());
+        File[] jarContents = dest.listFiles();
+        assertEquals(new File(dest, "META-INF"), jarContents[0]);
+        assertEquals(new File(dest, "test.txt"), jarContents[1]);
+        assertEquals(new File(dest, "META-INF/MANIFEST.MF"), jarContents[0].listFiles()[0]);
+    }
+
     private RetrieveOptions getRetrieveOptions() {
         return new RetrieveOptions();
     }