package io.github.ibuildthecloud.gdapi.request.resource.impl;
import io.github.ibuildthecloud.gdapi.factory.SchemaFactory;
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.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
public class ResourceManagerLocatorImpl extends AbstractResourceManagerLocatorImpl implements ResourceManagerLocator {
List<ResourceManager> resourceManagers;
List<ResourceManagerFilter> resourceManagerFilters;
ResourceManager defaultResourceManager;
Map<String, List<ResourceManagerFilter>> resourceManagerFiltersByType = new LinkedHashMap<String, List<ResourceManagerFilter>>();
Map<String, ResourceManager> resourceManagersByType = new LinkedHashMap<String, ResourceManager>();
/* Should not be used at runtime, just for startup */
SchemaFactory schemaFactory;
@PostConstruct
public void init() {
resourceManagersByType.clear();
resourceManagerFiltersByType.clear();
for (ResourceManager rm : resourceManagers) {
for (String type : rm.getTypes()) {
resourceManagersByType.put(type, rm);
}
for (Class<?> clz : rm.getTypeClasses()) {
String type = schemaFactory.getSchemaName(clz);
if (type != null)
resourceManagersByType.put(type, rm);
}
}
for (ResourceManagerFilter filter : resourceManagerFilters) {
Set<String> once = new HashSet<>();
for (String type : filter.getTypes()) {
if (once.contains(type)) {
continue;
}
once.add(type);
add(resourceManagerFiltersByType, type, filter);
}
for (Class<?> clz : filter.getTypeClasses()) {
String type = schemaFactory.getSchemaName(clz);
if (type != null) {
if (once.contains(type)) {
continue;
}
once.add(type);
add(resourceManagerFiltersByType, type, filter);
}
}
}
}
@Override
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);
}
@Override
protected ResourceManager getResourceManagersByTypeInternal(String type) {
return resourceManagersByType.get(type);
}
@Override
protected List<ResourceManagerFilter> getResourceManagerFiltersByTypeInternal(String type) {
return resourceManagerFiltersByType.get(type);
}
@Override
public ResourceManager getDefaultResourceManager() {
return defaultResourceManager;
}
public void setDefaultResourceManager(ResourceManager defaultResourceManager) {
this.defaultResourceManager = defaultResourceManager;
}
public List<ResourceManagerFilter> getResourceManagerFilters() {
return resourceManagerFilters;
}
@Inject
public void setResourceManagerFilters(List<ResourceManagerFilter> resourceManagerFilters) {
this.resourceManagerFilters = resourceManagerFilters;
}
public List<ResourceManager> getResourceManagers() {
return resourceManagers;
}
@Inject
public void setResourceManagers(List<ResourceManager> resourceManagers) {
this.resourceManagers = resourceManagers;
}
public SchemaFactory getSchemaFactory() {
return schemaFactory;
}
public void setSchemaFactory(SchemaFactory schemaFactory) {
this.schemaFactory = schemaFactory;
}
}