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
41 checkNotNull(basedir, "basedir");
42
43 logger.info(format("scanning for jenkins jobs - [%s]", basedir));
44
45
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
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 }