IMPROVEMENT: Pre and post retrieve artifact events (IVY-1084)
authorXavier Hanin <xavier@apache.org>
Tue, 26 May 2009 15:50:41 +0000 (15:50 +0000)
committerXavier Hanin <xavier@apache.org>
Tue, 26 May 2009 15:50:41 +0000 (15:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/ant/ivy/core/trunk@778769 13f79535-47bb-0310-9956-ffa450edef68

CHANGES.txt
doc/settings/triggers.html
src/java/org/apache/ivy/core/event/retrieve/EndRetrieveArtifactEvent.java [new file with mode: 0644]
src/java/org/apache/ivy/core/event/retrieve/RetrieveArtifactEvent.java [new file with mode: 0644]
src/java/org/apache/ivy/core/event/retrieve/StartRetrieveArtifactEvent.java [new file with mode: 0644]
src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java
test/java/org/apache/ivy/core/retrieve/RetrieveTest.java

index eae5e51..44f68c4 100644 (file)
@@ -87,6 +87,8 @@ for detailed view of each issue, please consult http://issues.apache.org/jira/br
        
    trunk
 =====================================
+- IMPROVEMENT: Pre and post retrieve artifact events (IVY-1084)
+
 - FIX: Ibiblio resolver throws IndexOutOfBoundsException when using snapshot versions with usepoms='false' (IVY-1028)
 - FIX: Wrong BuildException messages (findmodules) (IVY-1056)
 - FIX: PomModuleDescriptorBuilder does not resolve ejb type dependencies to jar extension (IVY-1058) (thanks to Andrey Lomakin)
index 2e96411..4bca7a7 100644 (file)
@@ -171,6 +171,40 @@ The event available in Ivy are the following ones:
         </td>
         <td>Fired at the end of the retrieve process.</td>
     </tr>
+    <tr><td>pre-retrieve-artifact <br/><span class="since">since 2.1</span></td>
+        <td>
+          <ul>
+            <li>organisation</li>the organisation of the artifact which is about to be retrieved
+            <li>module</li>the name of the module of the artifact which is about to be retrieved
+            <li>revision</li>the revision of the the artifact which is about to be retrieved
+            <li>artifact</li>the name of the the artifact which is about to be retrieved
+            <li>type</li>the type of the the artifact which is about to be retrieved
+            <li>ext</li>the extension of the the artifact which is about to be retrieved
+            <li>metadata</li>true if the retrieved artifact is a metadata artifact, false for published artifacts 
+            <li>size</li>the size in bytes of the retrieved artifact
+            <li>from</li>the absolute path from which it will be retrieved (usually a location in cache)
+            <li>to</li>the absolute path to which it will be retrieved
+          </ul>
+        </td>
+        <td>Fired before an artifact is retrieved from cache to a local location</td>
+    </tr>
+    <tr><td>post-retrieve-artifact <br/><span class="since">since 2.1</span></td>
+        <td>
+          <ul>
+            <li>organisation</li>the organisation of the artifact which has just been retrieved
+            <li>module</li>the name of the module of the artifact which has just been retrieved
+            <li>revision</li>the revision of the the artifact which has just been retrieved
+            <li>artifact</li>the name of the the artifact which has just been retrieved
+            <li>type</li>the type of the the artifact which has just been retrieved
+            <li>ext</li>the extension of the the artifact which has just been retrieved
+            <li>metadata</li>true if the retrieved artifact is a metadata artifact, false for published artifacts 
+            <li>size</li>the size in bytes of the retrieved artifact
+            <li>from</li>the absolute path from which it has just been retrieved (usually a location in cache)
+            <li>to</li>the absolute path to which it has just been retrieved
+          </ul>
+        </td>
+        <td>Fired after an artifact is retrieved from cache to a local location</td>
+    </tr>
     <tr><td>pre-publish-artifact <br/><span class="since">since 2.0</span></td>
         <td>
           <ul>
diff --git a/src/java/org/apache/ivy/core/event/retrieve/EndRetrieveArtifactEvent.java b/src/java/org/apache/ivy/core/event/retrieve/EndRetrieveArtifactEvent.java
new file mode 100644 (file)
index 0000000..09c3a96
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ *  Licensed to the Apache Software Foundation (ASF) under one or more\r
+ *  contributor license agreements.  See the NOTICE file distributed with\r
+ *  this work for additional information regarding copyright ownership.\r
+ *  The ASF licenses this file to You under the Apache License, Version 2.0\r
+ *  (the "License"); you may not use this file except in compliance with\r
+ *  the License.  You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *\r
+ */\r
+package org.apache.ivy.core.event.retrieve;\r
+\r
+import java.io.File;\r
+\r
+import org.apache.ivy.core.report.ArtifactDownloadReport;\r
+\r
+public class EndRetrieveArtifactEvent extends RetrieveArtifactEvent {\r
+    public static final String NAME = "pre-retrieve-artifact";\r
+\r
+    public EndRetrieveArtifactEvent(\r
+            ArtifactDownloadReport report, File destFile) {\r
+        super(NAME, report, destFile);\r
+    }\r
+}\r
diff --git a/src/java/org/apache/ivy/core/event/retrieve/RetrieveArtifactEvent.java b/src/java/org/apache/ivy/core/event/retrieve/RetrieveArtifactEvent.java
new file mode 100644 (file)
index 0000000..e35feaf
--- /dev/null
@@ -0,0 +1,57 @@
+/*\r
+ *  Licensed to the Apache Software Foundation (ASF) under one or more\r
+ *  contributor license agreements.  See the NOTICE file distributed with\r
+ *  this work for additional information regarding copyright ownership.\r
+ *  The ASF licenses this file to You under the Apache License, Version 2.0\r
+ *  (the "License"); you may not use this file except in compliance with\r
+ *  the License.  You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *\r
+ */\r
+package org.apache.ivy.core.event.retrieve;\r
+\r
+import java.io.File;\r
+\r
+import org.apache.ivy.core.event.IvyEvent;\r
+import org.apache.ivy.core.module.descriptor.Artifact;\r
+import org.apache.ivy.core.report.ArtifactDownloadReport;\r
+\r
+public class RetrieveArtifactEvent extends IvyEvent {\r
+    private ArtifactDownloadReport report;\r
+\r
+    private File destFile;\r
+\r
+    public RetrieveArtifactEvent(\r
+            String name,\r
+            ArtifactDownloadReport report, File destFile) {\r
+        super(name);\r
+        addArtifactAttributes(report.getArtifact());\r
+        \r
+        this.report = report;\r
+        this.destFile = destFile;\r
+        addAttribute("from", report.getLocalFile().getAbsolutePath());\r
+        addAttribute("to", destFile.getAbsolutePath());\r
+        addAttribute("size", String.valueOf(destFile.length()));        \r
+    }\r
+\r
+    protected void addArtifactAttributes(Artifact artifact) {\r
+        addMridAttributes(artifact.getModuleRevisionId());\r
+        addAttributes(artifact.getAttributes());\r
+        addAttribute("metadata", String.valueOf(artifact.isMetadata()));\r
+    }\r
+    \r
+    public File getDestFile() {\r
+        return destFile;\r
+    }\r
+    \r
+    public ArtifactDownloadReport getReport() {\r
+        return report;\r
+    }\r
+}\r
diff --git a/src/java/org/apache/ivy/core/event/retrieve/StartRetrieveArtifactEvent.java b/src/java/org/apache/ivy/core/event/retrieve/StartRetrieveArtifactEvent.java
new file mode 100644 (file)
index 0000000..9faefa2
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ *  Licensed to the Apache Software Foundation (ASF) under one or more\r
+ *  contributor license agreements.  See the NOTICE file distributed with\r
+ *  this work for additional information regarding copyright ownership.\r
+ *  The ASF licenses this file to You under the Apache License, Version 2.0\r
+ *  (the "License"); you may not use this file except in compliance with\r
+ *  the License.  You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *\r
+ */\r
+package org.apache.ivy.core.event.retrieve;\r
+\r
+import java.io.File;\r
+\r
+import org.apache.ivy.core.report.ArtifactDownloadReport;\r
+\r
+public class StartRetrieveArtifactEvent extends RetrieveArtifactEvent {\r
+    public static final String NAME = "pre-retrieve-artifact";\r
+\r
+    public StartRetrieveArtifactEvent(\r
+            ArtifactDownloadReport report, File destFile) {\r
+        super(NAME, report, destFile);\r
+    }\r
+}\r
index 7a11890..f568cc8 100644 (file)
@@ -38,7 +38,9 @@ import org.apache.ivy.core.IvyPatternHelper;
 import org.apache.ivy.core.LogOptions;
 import org.apache.ivy.core.cache.ResolutionCacheManager;
 import org.apache.ivy.core.event.EventManager;
+import org.apache.ivy.core.event.retrieve.EndRetrieveArtifactEvent;
 import org.apache.ivy.core.event.retrieve.EndRetrieveEvent;
+import org.apache.ivy.core.event.retrieve.StartRetrieveArtifactEvent;
 import org.apache.ivy.core.event.retrieve.StartRetrieveEvent;
 import org.apache.ivy.core.module.descriptor.Artifact;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
@@ -128,11 +130,19 @@ public class RetrieveEngine {
                     File destFile = settings.resolveFile((String) it2.next());
                     if (!settings.isCheckUpToDate() || !upToDate(archive, destFile)) {
                         Message.verbose("\t\tto " + destFile);
+                        if (this.eventManager != null) {
+                            this.eventManager.fireIvyEvent(
+                                new StartRetrieveArtifactEvent(artifact, destFile));
+                        }
                         if (options.isMakeSymlinks()) {
                             FileUtil.symlink(archive, destFile, null, true);
                         } else {
                             FileUtil.copy(archive, destFile, null, true);
                         }
+                        if (this.eventManager != null) {
+                            this.eventManager.fireIvyEvent(
+                                new EndRetrieveArtifactEvent(artifact, destFile));
+                        }
                         totalCopiedSize += destFile.length();
                         targetsCopied++;
                     } else {
index 511dcbb..6601544 100644 (file)
@@ -28,7 +28,9 @@ import org.apache.ivy.Ivy;
 import org.apache.ivy.core.IvyPatternHelper;
 import org.apache.ivy.core.event.IvyEvent;
 import org.apache.ivy.core.event.IvyListener;
+import org.apache.ivy.core.event.retrieve.EndRetrieveArtifactEvent;
 import org.apache.ivy.core.event.retrieve.EndRetrieveEvent;
+import org.apache.ivy.core.event.retrieve.StartRetrieveArtifactEvent;
 import org.apache.ivy.core.event.retrieve.StartRetrieveEvent;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.report.ResolveReport;
@@ -141,10 +143,12 @@ public class RetrieveTest extends TestCase {
         ModuleDescriptor md = report.getModuleDescriptor();
         String pattern = "build/test/retrieve/[module]/[conf]/[artifact]-[revision].[ext]";
         ivy.retrieve(md.getModuleRevisionId(), pattern, getRetrieveOptions());
-        assertEquals(2, events.size());
+        assertEquals(4, events.size());
         assertTrue(events.get(0) instanceof StartRetrieveEvent);
-        assertTrue(events.get(1) instanceof EndRetrieveEvent);
-        EndRetrieveEvent ev = (EndRetrieveEvent) events.get(1);
+        assertTrue(events.get(1) instanceof StartRetrieveArtifactEvent);
+        assertTrue(events.get(2) instanceof EndRetrieveArtifactEvent);
+        assertTrue(events.get(3) instanceof EndRetrieveEvent);
+        EndRetrieveEvent ev = (EndRetrieveEvent) events.get(3);
         assertEquals(1, ev.getNbCopied());
         assertEquals(0, ev.getNbUpToDate());