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    }