001 package org.kuali.common.jdbc.suppliers;
002
003 import java.util.ArrayList;
004 import java.util.List;
005
006 import org.apache.commons.lang3.StringUtils;
007 import org.kuali.common.util.Assert;
008 import org.kuali.common.util.CollectionUtils;
009 import org.kuali.common.util.ListUtils;
010 import org.kuali.common.util.LocationUtils;
011
012 public final class ResourcesSupplierFactory {
013
014 public static final String DEFAULT_EXTENSION = "resources";
015
016 public ResourcesSupplierFactory(LocationSupplierFactory factory) {
017 this(CollectionUtils.singletonList(factory));
018 }
019
020 public ResourcesSupplierFactory(List<LocationSupplierFactory> factories) {
021 this(DEFAULT_EXTENSION, factories);
022 }
023
024 public ResourcesSupplierFactory(String extension, List<LocationSupplierFactory> factories) {
025 Assert.noBlanks(extension);
026 Assert.isFalse(CollectionUtils.isEmpty(factories), "Must provide at least one factory");
027 this.factories = ListUtils.newImmutableArrayList(factories);
028 this.extension = extension;
029 this.suffix = "." + extension;
030 }
031
032 private final String extension;
033 private final String suffix;
034 private final List<LocationSupplierFactory> factories;
035
036 public List<SqlSupplier> getSuppliers(List<String> resourceLocations) {
037 List<SqlSupplier> suppliers = new ArrayList<SqlSupplier>();
038 for (String resourceLocation : resourceLocations) {
039 suppliers.addAll(getSuppliers(resourceLocation));
040 }
041 return suppliers;
042 }
043
044 public List<SqlSupplier> getSuppliers(String resourcesLocation) {
045 Assert.noBlanks(resourcesLocation);
046 Assert.isTrue(isMatch(resourcesLocation));
047 List<String> resources = LocationUtils.getLocations(resourcesLocation);
048 List<SqlSupplier> suppliers = new ArrayList<SqlSupplier>();
049 for (String resource : resources) {
050 SqlSupplier supplier = getSupplier(resource);
051 suppliers.add(supplier);
052 }
053 return suppliers;
054 }
055
056 public SqlSupplier getSupplier(String location) {
057 Assert.noBlanks(location);
058 LocationSupplierFactory factory = findFactory(location);
059 return factory.getSupplier(location);
060 }
061
062 protected LocationSupplierFactory findFactory(String location) {
063 for (LocationSupplierFactory factory : factories) {
064 if (factory.isMatch(location)) {
065 return factory;
066 }
067 }
068 throw new IllegalStateException("Unable to locate a factory for [" + location + "]");
069 }
070
071 public boolean isMatch(String location) {
072 return StringUtils.endsWith(location, suffix);
073 }
074
075 public String getExtension() {
076 return extension;
077 }
078
079 public String getSuffix() {
080 return suffix;
081 }
082
083 public List<LocationSupplierFactory> getFactories() {
084 return factories;
085 }
086
087 }