View Javadoc
1   package org.kuali.common.devops.cache;
2   
3   import static java.lang.String.format;
4   import static org.apache.commons.lang.StringUtils.leftPad;
5   import static org.kuali.common.util.base.Precondition.checkNotBlank;
6   
7   import java.io.File;
8   import java.util.Properties;
9   import java.util.Set;
10  
11  import javax.validation.ConstraintViolation;
12  
13  import org.kuali.common.core.build.ViolationsBuilder;
14  import org.kuali.common.core.validate.annotation.FinalClass;
15  import org.kuali.common.core.validate.annotation.NoNullFields;
16  import org.kuali.common.util.PropertyUtils;
17  import org.kuali.common.util.file.CanonicalFile;
18  import org.kuali.common.util.property.ImmutableProperties;
19  
20  import com.google.common.base.Function;
21  
22  @NoNullFields
23  @FinalClass
24  public final class UrlPropertiesFileFunction implements Function<String, File> {
25  
26  	private int sequence = 1;
27  	private final Properties urlToFileMapping;
28  	private final File basedir;
29  	private final File cacheManager;
30  
31  	@Override
32  	public File apply(String url) {
33  		checkNotBlank(url, "url");
34  		return new CanonicalFile(basedir, getPath(url));
35  	}
36  
37  	protected String getPath(String url) {
38  		synchronized (urlToFileMapping) {
39  			String path = urlToFileMapping.getProperty(url);
40  			if (path == null) {
41  				path = leftPad(format("%s", sequence++), 3, "0") + ".json";
42  				urlToFileMapping.put(url, path);
43  				PropertyUtils.storeSilently(urlToFileMapping, cacheManager);
44  			}
45  			return path;
46  		}
47  	}
48  
49  	private UrlPropertiesFileFunction(Builder builder) {
50  		this.basedir = builder.basedir;
51  		this.cacheManager = new CanonicalFile(basedir, "cache.properties");
52  		if (this.cacheManager.exists()) {
53  			this.urlToFileMapping = PropertyUtils.load(cacheManager);
54  		} else {
55  			this.urlToFileMapping = new Properties();
56  		}
57  	}
58  
59  	public static UrlPropertiesFileFunction newUrlPropertiesFileFunction(File basedir) {
60  		return builder().basedir(basedir).build();
61  	}
62  
63  	public static UrlPropertiesFileFunction newUrlPropertiesFileFunction() {
64  		return builder().build();
65  	}
66  
67  	public static Builder builder() {
68  		return new Builder();
69  	}
70  
71  	public static class Builder extends ViolationsBuilder<UrlPropertiesFileFunction> {
72  
73  		private File basedir = new CanonicalFile("./target/cache/urls");
74  
75  		@Override
76  		public Set<ConstraintViolation<UrlPropertiesFileFunction>> violations() {
77  			return violations(make());
78  		}
79  
80  		@Override
81  		public UrlPropertiesFileFunction build() {
82  			return validate(make());
83  		}
84  
85  		private UrlPropertiesFileFunction make() {
86  			return new UrlPropertiesFileFunction(this);
87  		}
88  
89  		public Builder basedir(File basedir) {
90  			this.basedir = basedir;
91  			return this;
92  		}
93  
94  		public File getBasedir() {
95  			return basedir;
96  		}
97  
98  		public void setBasedir(File basedir) {
99  			this.basedir = basedir;
100 		}
101 
102 	}
103 
104 	public File getBasedir() {
105 		return basedir;
106 	}
107 
108 	public Properties getUrlToFileMapping() {
109 		return ImmutableProperties.copyOf(urlToFileMapping);
110 	}
111 
112 	public File getCacheManager() {
113 		return cacheManager;
114 	}
115 
116 }