View Javadoc
1   package org.kuali.common.devops.jenkins.scan.function;
2   
3   import static com.google.common.base.Stopwatch.createStarted;
4   import static com.google.common.collect.Lists.newArrayList;
5   import static com.google.common.collect.Sets.newTreeSet;
6   import static java.lang.String.format;
7   import static org.apache.commons.lang.StringUtils.leftPad;
8   import static org.apache.commons.lang.StringUtils.remove;
9   import static org.apache.commons.lang.StringUtils.rightPad;
10  import static org.kuali.common.devops.jenkins.scan.function.FileListFunction.LIST_ALL_FILES_FUNCTION;
11  import static org.kuali.common.util.FormatUtils.getTime;
12  import static org.kuali.common.util.base.Precondition.checkNotNull;
13  import static org.kuali.common.util.log.Loggers.newLogger;
14  
15  import java.io.File;
16  import java.io.FilenameFilter;
17  import java.util.List;
18  import java.util.Set;
19  
20  import org.kuali.common.devops.jenkins.scan.FilenameFilters;
21  import org.kuali.common.devops.jenkins.scan.Job;
22  import org.kuali.common.devops.jenkins.scan.JobExecution;
23  import org.kuali.common.util.file.CanonicalFile;
24  import org.slf4j.Logger;
25  
26  import com.google.common.base.Function;
27  import com.google.common.base.Stopwatch;
28  import com.google.common.collect.ImmutableList;
29  
30  public class CurrentJobsFunction implements Function<File, List<Job>> {
31  
32  	private final FilenameFilter jobsFilter = FilenameFilters.JobsFilter.INSTANCE;
33  	private final Function<File, Long> startTimeFunction = JobExecutionStartTimeFunction.build();
34  	private final Function<File, JobExecution> jobExecutionFunction = new JobExecutionFunction(startTimeFunction);
35  
36  	private static final Logger logger = newLogger();
37  
38  	@Override
39  	public List<Job> apply(File basedir) {
40  		// Null not allowed
41  		checkNotNull(basedir, "basedir");
42  
43  		logger.info(format("scanning for jenkins jobs - [%s]", basedir));
44  
45  		// Get a list of the directories holding jobs
46  		Stopwatch sw = createStarted();
47  		List<File> jobDirectories = new FileListFunction(jobsFilter).apply(basedir);
48  
49  		logger.info(format("located %s job directories - %s", jobDirectories.size(), getTime(sw)));
50  
51  		// Examine the directories
52  		return getJobs(basedir, jobDirectories);
53  	}
54  
55  	protected List<Job> getJobs(File basedir, List<File> jobDirectories) {
56  		List<Job> jobs = newArrayList();
57  		String remove = new CanonicalFile(basedir).getPath() + File.separator;
58  		for (File jobDirectory : jobDirectories) {
59  			Job job = getJob(jobDirectory, remove);
60  			jobs.add(job);
61  		}
62  		return ImmutableList.copyOf(jobs);
63  	}
64  
65  	protected Job getJob(File jobDirectory, String remove) {
66  		String path = jobDirectory.getPath();
67  		String name = remove(path, remove);
68  		Stopwatch sw = createStarted();
69  		print("[INFO] %s ", rightPad(name, 75));
70  		List<JobExecution> executions = getExecutions(jobDirectory);
71  		println("%s - %s", leftPad(executions.size() + "", 5), getTime(sw));
72  		return Job.build(name, executions);
73  	}
74  
75  	protected List<JobExecution> getExecutions(File jobDirectory) {
76  		File jobExecutionsDirectory = new File(jobDirectory, "builds");
77  		Set<File> jobExecutionDirectories = newTreeSet(LIST_ALL_FILES_FUNCTION.apply(jobExecutionsDirectory));
78  		List<JobExecution> executions = newArrayList();
79  		for (File jobExecutionDirectory : jobExecutionDirectories) {
80  			File buildXml = new File(jobExecutionDirectory, "build.xml");
81  			if (buildXml.exists()) {
82  				JobExecution execution = jobExecutionFunction.apply(jobExecutionDirectory);
83  				executions.add(execution);
84  			}
85  		}
86  		return ImmutableList.copyOf(executions);
87  	}
88  
89  	protected static void print(String msg, Object... args) {
90  		System.out.print((args == null) ? msg : format(msg, args));
91  	}
92  
93  	protected static void println(String msg, Object... args) {
94  		print(msg + "\n", args);
95  	}
96  }