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 }