package org.jtwig.resource.loader; import com.google.common.base.Optional; import com.google.common.base.Supplier; import org.jtwig.resource.exceptions.ResourceNotFoundException; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.URL; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; public class InMemoryResourceLoader implements ResourceLoader { public static InMemoryResourceLoader.Builder builder () { return new InMemoryResourceLoader.Builder(); } private final Map<String, Supplier<InputStream>> inputStreamMap; public InMemoryResourceLoader(Map<String, Supplier<InputStream>> inputStreamMap) { this.inputStreamMap = inputStreamMap; } @Override public Optional<Charset> getCharset(String path) { return Optional.absent(); } @Override public InputStream load(String path) { Supplier<InputStream> streamSupplier = inputStreamMap.get(path); if (streamSupplier == null) throw new ResourceNotFoundException(String.format("Resource '%s' not found", path)); return streamSupplier.get(); } @Override public boolean exists(String path) { return inputStreamMap.containsKey(path); } @Override public Optional<URL> toUrl(String path) { return Optional.absent(); } public static class Builder implements org.apache.commons.lang3.builder.Builder<InMemoryResourceLoader> { private final Map<String, Supplier<InputStream>> supplierMap = new HashMap<>(); public Builder withResource (String key, String content) { supplierMap.put(key, new StringInputStreamSupplier(content)); return this; } @Override public InMemoryResourceLoader build() { return new InMemoryResourceLoader(supplierMap); } } public static class StringInputStreamSupplier implements Supplier<InputStream> { private final String content; public StringInputStreamSupplier(String content) { this.content = content; } @Override public InputStream get() { return new ByteArrayInputStream(content.getBytes()); } } }