View Javadoc
1   package org.kuali.common.devops.archive.sweep.suppliers;
2   
3   import static com.google.common.collect.Iterables.concat;
4   import static com.google.common.collect.Iterables.filter;
5   import static com.google.common.collect.Lists.newArrayList;
6   import static com.google.common.collect.Maps.newHashMap;
7   import static com.google.common.collect.Ordering.natural;
8   import static java.lang.String.format;
9   import static java.util.Arrays.asList;
10  import static java.util.Collections.singletonList;
11  import static org.apache.commons.lang.StringUtils.removeEnd;
12  import static org.apache.commons.lang.StringUtils.substringAfter;
13  import static org.apache.commons.lang3.StringUtils.countMatches;
14  import static org.apache.commons.lang3.StringUtils.isNotBlank;
15  import static org.kuali.common.devops.archive.sweep.Functions.hostnameToKey;
16  import static org.kuali.common.devops.jenkins.upgrade.S3.isDir;
17  import static org.kuali.common.devops.jenkins.upgrade.S3.objectsAsMap;
18  import static org.kuali.common.util.log.Loggers.newLogger;
19  
20  import java.util.List;
21  import java.util.Map;
22  
23  import org.kuali.common.aws.s3.S3Service;
24  import org.kuali.common.aws.s3.model.ObjectSummary;
25  import org.kuali.common.core.build.ValidatingBuilder;
26  import org.kuali.common.core.validate.annotation.IdiotProofImmutable;
27  import org.kuali.common.devops.jenkins.upgrade.model.JenkinsSummary;
28  import org.slf4j.Logger;
29  
30  @IdiotProofImmutable
31  public final class JenkinsBuilder {
32  
33  	private static final Logger logger = newLogger();
34  
35  	private final String hostname;
36  	private final String bucket;
37  	private final String basedir;
38  	private final String timeZoneId;
39  	private final S3Service s3;
40  
41  	public JenkinsSummary buildJenkins(List<ObjectSummary> objects) {
42  		Map<String, ObjectSummary> map = objectsAsMap(objects);
43  		String key = hostnameToKey().apply(hostname) + basedir + "/";
44  		ObjectSummary jenkinsHome = map.get(key);
45  		String jobsDir = ".jenkins/jobs";
46  		Map<String, ObjectSummary> jobs = getSubDirs(objects, jobsDir);
47  		Iterable<ObjectSummary> builds = getBuilds(objects, jobsDir, jobs.keySet());
48  		List<ObjectSummary> all = natural().immutableSortedCopy(concat(jobs.values(), builds, asList(jenkinsHome)));
49  		for (ObjectSummary object : all) {
50  			info("%s", object.getKey());
51  		}
52  		return null;
53  	}
54  
55  	public Iterable<ObjectSummary> getBuilds(List<ObjectSummary> objects, String jobsDir, Iterable<String> jobs) {
56  		List<String> uniqueDirNames = newArrayList();
57  		for (String name : jobs) {
58  			String uniqueDirName = jobsDir + "/" + name + "/builds";
59  			uniqueDirNames.add(uniqueDirName);
60  		}
61  		return getSubDirs(objects, uniqueDirNames).values();
62  	}
63  
64  	public Map<String, ObjectSummary> getSubDirs(List<ObjectSummary> objects, String uniqueDirName) {
65  		return getSubDirs(objects, singletonList(uniqueDirName));
66  	}
67  
68  	public Map<String, ObjectSummary> getSubDirs(List<ObjectSummary> objects, Iterable<String> uniqueDirNames) {
69  		Map<String, ObjectSummary> map = newHashMap();
70  		Iterable<ObjectSummary> dirs = filter(objects, isDir());
71  		for (String uniqueDirectoryName : uniqueDirNames) {
72  			String separator = "/" + uniqueDirectoryName + "/";
73  			for (ObjectSummary dir : dirs) {
74  				String name = removeEnd(substringAfter(dir.getKey(), separator), "/");
75  				if (isNotBlank(name) && countMatches(name, "/") == 0) {
76  					map.put(name, dir);
77  				}
78  			}
79  		}
80  		return map;
81  	}
82  
83  	public static Builder builder() {
84  		return new Builder();
85  	}
86  
87  	private JenkinsBuilder(Builder builder) {
88  		this.timeZoneId = builder.timeZoneId;
89  		this.hostname = builder.hostname;
90  		this.bucket = builder.bucket;
91  		this.basedir = builder.basedir;
92  		this.s3 = builder.s3;
93  	}
94  
95  	public static class Builder extends ValidatingBuilder<JenkinsBuilder> {
96  
97  		private S3Service s3;
98  		private String bucket;
99  		private String timeZoneId;
100 		private String hostname;
101 		private String basedir;
102 
103 		public Builder withS3(S3Service s3) {
104 			this.s3 = s3;
105 			return this;
106 		}
107 
108 		public Builder withBucket(String bucket) {
109 			this.bucket = bucket;
110 			return this;
111 		}
112 
113 		public Builder withTimeZoneId(String timeZoneId) {
114 			this.timeZoneId = timeZoneId;
115 			return this;
116 		}
117 
118 		public Builder withHostname(String hostname) {
119 			this.hostname = hostname;
120 			return this;
121 		}
122 
123 		public Builder withBasedir(String basedir) {
124 			this.basedir = basedir;
125 			return this;
126 		}
127 
128 		@Override
129 		public JenkinsBuilder build() {
130 			return validate(new JenkinsBuilder(this));
131 		}
132 	}
133 
134 	public String getHostname() {
135 		return hostname;
136 	}
137 
138 	public String getTimeZoneId() {
139 		return timeZoneId;
140 	}
141 
142 	public String getBasedir() {
143 		return basedir;
144 	}
145 
146 	protected static void info(String msg, Object... args) {
147 		logger.info((args == null || args.length == 0) ? msg : format(msg, args));
148 	}
149 
150 	public String getBucket() {
151 		return bucket;
152 	}
153 
154 	public S3Service getS3() {
155 		return s3;
156 	}
157 }