package io.github.ibuildthecloud.gdapi.request.resource.impl; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager; import io.github.ibuildthecloud.gdapi.request.resource.ResourceManagerFilter; import io.github.ibuildthecloud.gdapi.request.resource.ResourceManagerLocator; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public abstract class AbstractResourceManagerLocatorImpl implements ResourceManagerLocator { Map<Object, ResourceManager> cached = new ConcurrentHashMap<Object, ResourceManager>(); @Override public ResourceManager getResourceManager(ApiRequest request) { if (request.getType() == null) return null; return getResourceManagerByType(request.getType()); } protected abstract ResourceManager getDefaultResourceManager(); protected abstract ResourceManager getResourceManagersByTypeInternal(String type); protected abstract List<ResourceManagerFilter> getResourceManagerFiltersByTypeInternal(String type); @Override public ResourceManager getResourceManagerByType(String type) { if (type == null) { return null; } ResourceManager rm = cached.get(type); if (rm != null) { return rm; } rm = getResourceManagersByTypeInternal(type); if (rm == null) { rm = getDefaultResourceManager(); } if (rm == null) { return rm; } List<ResourceManagerFilter> filters = getResourceManagerFiltersByTypeInternal(type); if (filters == null) { return rm; } rm = wrap(filters, rm); cached.put(type, rm); return rm; } protected ResourceManager wrap(List<ResourceManagerFilter> filters, ResourceManager resourceManager) { if (filters.size() == 0) { return resourceManager; } if (filters.size() == 1) { return new FilteredResourceManager(filters.get(0), resourceManager); } return new FilteredResourceManager(filters.get(0), wrap(filters.subList(1, filters.size()), resourceManager)); } protected void add(Map<String, List<ResourceManagerFilter>> filters, String key, ResourceManagerFilter filter) { List<ResourceManagerFilter> list = filters.get(key); if (list == null) { list = new ArrayList<ResourceManagerFilter>(); filters.put(key, list); } list.add(filter); } }