package nebula.data; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import nebula.lang.FindableList; public class Repos implements StoreProvider { Map<String, Store<?>> stores = new HashMap<String, Store<?>>(); FindableList<Pattern, StoreProvider> provideres = new FindableList<Pattern, StoreProvider>(); @Override @SuppressWarnings("unchecked") public <T> Store<T> get(Class<T> clz) { Store<T> store = (Store<T>) stores.get(clz); if (store != null) { return store; } return this.find(clz); } @Override public Store<?> get(String typeName) { Store<?> store = (Store<?>) stores.get(typeName); if (store != null) { return store; } return this.find(typeName); } Store<?> find(String name) { Store<?> store = null; for (Pattern p : provideres.getKeys().keySet()) { if (p.matcher(name).matches()) { store = provideres.get(p).get(name); if (store != null) { stores.put(name, store); return store; } } } return null; } <T> Store<T> find(Class<T> clz) { Store<T> store = null; for (Pattern p : provideres.getKeys().keySet()) { if (p.matcher(clz.getName()).matches()) { store = provideres.get(p).get(clz); if (store != null) { stores.put(clz.getName(), store); return store; } } } return null; } void bindTo(String regex, StoreProvider storeProvider) { regex = regex.replaceAll("[\\.]", "[.]"); regex = regex.replaceAll("[\\*]", ".*"); provideres.put(Pattern.compile(regex), storeProvider); } }