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 ; 20 import java.io.IOException ; 21 import java.util.Collection ; 22 import java.util.HashMap ; 23 import java.util.HashSet ; 24 import java.util.List ; 25 import java.util.Map ; 26 import java.util.Set ; 27 28 33 public class MavenFingerprinter extends MavenReporter { 34 35 38 private transient Set <File > files; 39 42 private transient Map<String ,String > record; 43 44 public boolean preBuild(MavenBuildProxy build, MavenProject pom, BuildListener listener) throws InterruptedException , IOException { 45 files = new HashSet <File >(); 46 record = new HashMap <String ,String >(); 47 return true; 48 } 49 50 public boolean postExecute(MavenBuildProxy build, MavenProject pom, MojoInfo mojo, BuildListener listener) throws InterruptedException , IOException { 51 boolean updated = false; 52 53 updated |= record(build,false,pom.getArtifacts()); 56 57 updated |= record(build,true,pom.getArtifact()); 59 updated |= record(build,true,pom.getAttachedArtifacts()); 60 61 if(updated) { 62 build.execute(new BuildCallable<Void ,IOException >() { 63 private final Map<String , String > r = record; 65 66 public Void call(MavenBuild build) throws IOException , InterruptedException { 67 FingerprintAction a = build.getAction(FingerprintAction.class); 69 List <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 <Artifact> artifacts) throws IOException , InterruptedException { 82 boolean updated = false; 83 for (Artifact a : artifacts) 84 updated |= record(build,produced,a); 85 return updated; 86 } 87 88 95 private boolean record(MavenBuildProxy build, final boolean produced, Artifact a) throws IOException , InterruptedException { 96 File f = a.getFile(); 97 if(f==null || !f.exists() || f.isDirectory() || !files.add(f)) 98 return false; 99 100 final String digest = new FilePath(f).digest(); 102 final String name = a.getGroupId()+':'+f.getName(); 103 record.put(name,digest); 104 105 build.execute(new BuildCallable<Void ,IOException >() { 106 public Void call(MavenBuild build) throws IOException , InterruptedException { 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 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 |