package org.jtwig.resource.environment;
import org.jtwig.resource.ResourceService;
import org.jtwig.resource.config.ResourceConfiguration;
import org.jtwig.resource.loader.CompositeResourceLoader;
import org.jtwig.resource.loader.ResourceLoader;
import org.jtwig.resource.loader.TypedResourceLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ResourceEnvironmentFactory {
public ResourceEnvironment create(ResourceConfiguration resourceConfiguration) {
List<TypedResourceLoader> resourceLoaders = resourceConfiguration.getResourceLoaders();
Map<String, ResourceLoader> resourceLoaderMap = resourceLoaderListToMap(resourceLoaders);
ResourceService resourceService = new ResourceService(
resourceLoaderMap,
resourceLoaders,
resourceConfiguration.getAbsoluteResourceTypes(),
resourceConfiguration.getRelativeResourceResolvers(),
resourceConfiguration.getResourceReferenceExtractor());
return new ResourceEnvironment(resourceConfiguration.getDefaultCharset(), resourceService, resourceConfiguration.getResourceReferenceExtractor());
}
private Map<String, ResourceLoader> resourceLoaderListToMap(List<TypedResourceLoader> resourceLoaders) {
Map<String, List<ResourceLoader>> loaders = new HashMap<>();
for (TypedResourceLoader resourceLoader : resourceLoaders) {
if (!loaders.containsKey(resourceLoader.getType())) {
loaders.put(resourceLoader.getType(), new ArrayList<ResourceLoader>());
}
loaders.get(resourceLoader.getType()).add(resourceLoader.getResourceLoader());
}
Map<String, ResourceLoader> result = new HashMap<>();
for (Map.Entry<String, List<ResourceLoader>> entry : loaders.entrySet()) {
if (entry.getValue().size() <= 1) {
result.put(entry.getKey(), entry.getValue().get(0));
} else {
result.put(entry.getKey(), new CompositeResourceLoader(entry.getValue()));
}
}
return result;
}
}