KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > hudson > maven > reporters > MavenFingerprinter


1 package hudson.maven.reporters;
2
3 import hudson.FilePath;
4 import hudson.maven.MavenBuild;
5 import hudson.maven.MavenBuildProxy;
6 import hudson.maven.MavenBuildProxy.BuildCallable;
7 import hudson.maven.MavenModule;
8 import hudson.maven.MavenReporter;
9 import hudson.maven.MavenReporterDescriptor;
10 import hudson.maven.MojoInfo;
11 import hudson.model.Action;
12 import hudson.model.BuildListener;
13 import hudson.model.FingerprintMap;
14 import hudson.model.Hudson;
15 import hudson.tasks.Fingerprinter.FingerprintAction;
16 import org.apache.maven.artifact.Artifact;
17 import org.apache.maven.project.MavenProject;
18
19 import java.io.File JavaDoc;
20 import java.io.IOException JavaDoc;
21 import java.util.Collection JavaDoc;
22 import java.util.HashMap JavaDoc;
23 import java.util.HashSet JavaDoc;
24 import java.util.List JavaDoc;
25 import java.util.Map JavaDoc;
26 import java.util.Set JavaDoc;
27
28 /**
29  * Records fingerprints of the builds to keep track of dependencies.
30  *
31  * @author Kohsuke Kawaguchi
32  */

33 public class MavenFingerprinter extends MavenReporter {
34
35     /**
36      * Files whose fingerprints were already recorded.
37      */

38     private transient Set JavaDoc<File JavaDoc> files;
39     /**
40      * Recorded fingerprints.
41      */

42     private transient Map<String JavaDoc,String JavaDoc> record;
43
44     public boolean preBuild(MavenBuildProxy build, MavenProject pom, BuildListener listener) throws InterruptedException JavaDoc, IOException JavaDoc {
45         files = new HashSet JavaDoc<File JavaDoc>();
46         record = new HashMap JavaDoc<String JavaDoc,String JavaDoc>();
47         return true;
48     }
49
50     public boolean postExecute(MavenBuildProxy build, MavenProject pom, MojoInfo mojo, BuildListener listener) throws InterruptedException JavaDoc, IOException JavaDoc {
51         boolean updated = false;
52
53         // really nice if we can do this in preExecute,
54
// but dependency resolution only happens after preExecute.
55
updated |= record(build,false,pom.getArtifacts());
56
57         // try to pick up artifacts as soon as they are found.
58
updated |= record(build,true,pom.getArtifact());
59         updated |= record(build,true,pom.getAttachedArtifacts());
60
61         if(updated) {
62             build.execute(new BuildCallable<Void JavaDoc,IOException JavaDoc>() {
63                 // record is transient, so needs to make a copy first
64
private final Map<String JavaDoc, String JavaDoc> r = record;
65
66                 public Void JavaDoc call(MavenBuild build) throws IOException JavaDoc, InterruptedException JavaDoc {
67                     // update the build action with new fingerprints
68
FingerprintAction a = build.getAction(FingerprintAction.class);
69                     List JavaDoc<Action> actions = build.getActions();
70                     if(a!=null)
71                         actions.remove(a);
72                     actions.add(new FingerprintAction(build,r));
73                     return null;
74                 }
75             });
76         }
77
78         return true;
79     }
80
81     private boolean record(MavenBuildProxy build, boolean produced, Collection JavaDoc<Artifact> artifacts) throws IOException JavaDoc, InterruptedException JavaDoc {
82         boolean updated = false;
83         for (Artifact a : artifacts)
84             updated |= record(build,produced,a);
85         return updated;
86     }
87
88     /**
89      * Records the fingerprint of the given {@link Artifact}.
90      *
91      * <p>
92      * This method contains the logic to avoid doubly recording the fingerprint
93      * of the same file.
94      */

95     private boolean record(MavenBuildProxy build, final boolean produced, Artifact a) throws IOException JavaDoc, InterruptedException JavaDoc {
96         File JavaDoc f = a.getFile();
97         if(f==null || !f.exists() || f.isDirectory() || !files.add(f))
98             return false;
99
100         // new file
101
final String JavaDoc digest = new FilePath(f).digest();
102         final String JavaDoc name = a.getGroupId()+':'+f.getName();
103         record.put(name,digest);
104
105         build.execute(new BuildCallable<Void JavaDoc,IOException JavaDoc>() {
106             public Void JavaDoc call(MavenBuild build) throws IOException JavaDoc, InterruptedException JavaDoc {
107                 FingerprintMap map = Hudson.getInstance().getFingerprintMap();
108                 map.getOrCreate(produced?build:null, name, digest).add(build);
109                 return null;
110             }
111         });
112         return true;
113     }
114
115     public DescriptorImpl getDescriptor() {
116         return DescriptorImpl.DESCRIPTOR;
117     }
118
119     public static final class DescriptorImpl extends MavenReporterDescriptor {
120         public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
121
122         private DescriptorImpl() {
123             super(MavenFingerprinter.class);
124         }
125
126         public String JavaDoc getDisplayName() {
127             return "Record fingerprints";
128         }
129
130         public MavenReporter newAutoInstance(MavenModule module) {
131             return new MavenFingerprinter();
132         }
133     }
134
135     private static final long serialVersionUID = 1L;
136 }
137
Popular Tags