package io.github.ibuildthecloud.gdapi.response.impl;
import io.github.ibuildthecloud.gdapi.factory.SchemaFactory;
import io.github.ibuildthecloud.gdapi.model.Resource;
import io.github.ibuildthecloud.gdapi.response.ResourceOutputFilter;
import io.github.ibuildthecloud.gdapi.response.ResourceOutputFilterManager;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
public class ResourceOutputFilterManagerImpl implements ResourceOutputFilterManager {
SchemaFactory baseSchemaFactory;
List<ResourceOutputFilter> outputFilters;
Map<String, ResourceOutputFilter> filtersByType;
@Override
public ResourceOutputFilter getOutputFilter(Resource resource) {
if (resource == null) {
return null;
}
return getFiltersByType().get(resource.getType());
}
protected Map<String, ResourceOutputFilter> getFiltersByType() {
if (filtersByType != null) {
return filtersByType;
}
Map<String, ResourceOutputFilter> result = new HashMap<String, ResourceOutputFilter>();
for (ResourceOutputFilter filter : outputFilters) {
Set<String> types = new HashSet<String>();
String[] typeStrings = filter.getTypes();
for (String type : typeStrings) {
types.add(type);
}
for (Class<?> clz : filter.getTypeClasses()) {
if (typeStrings.length == 0) {
types.addAll(baseSchemaFactory.getSchemaNames(clz));
} else {
types.add(baseSchemaFactory.getSchemaName(clz));
}
}
for (String type : types) {
ResourceOutputFilter next = result.get(type);
if (next == null) {
result.put(type, filter);
} else {
result.put(type, new ResourceOutputFilterChain(filter, next));
}
}
}
return filtersByType = result;
}
public List<ResourceOutputFilter> getOutputFilters() {
return outputFilters;
}
@Inject
public void setOutputFilters(List<ResourceOutputFilter> outputFilters) {
this.outputFilters = outputFilters;
}
public SchemaFactory getBaseSchemaFactory() {
return baseSchemaFactory;
}
public void setBaseSchemaFactory(SchemaFactory baseSchemaFactory) {
this.baseSchemaFactory = baseSchemaFactory;
}
}