// Path: moshas/src/main/java/net/unit8/moshas/cache/JCacheTemplateCache.java
// public class JCacheTemplateCache implements TemplateCache {
//     private final Cache<String, Template> cache;
// 
//     public JCacheTemplateCache() {
//         Iterator<CachingProvider> cachingProviders = Caching.getCachingProviders().iterator();
//         if (cachingProviders.hasNext()) {
//             CachingProvider cachingProvider = cachingProviders.next();
//             CacheManager cacheManager = cachingProvider.getCacheManager();
//             Configuration<String, Template> config = new MutableConfiguration<String, Template>()
//                     .setTypes(String.class, Template.class)
//                     .setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 5)));
//             Cache<String, Template> cache = cacheManager.getCache("TemplateCache", String.class, Template.class);
//             if (cache == null) {
//                 this.cache = cacheManager.createCache("TemplateCache", config);
//             } else {
//                 this.cache = cache;
//             }
//         } else {
//             this.cache = null; // to keep compatibility with 0.1.0, but ugly
//         }
//     }
// 
//     @Override
//     public Template getTemplate(String source) {
//         if (this.cache == null) {
//             return null;
//         }
//         return this.cache.get(source);
//     }
// 
//     @Override
//     public void putTemplate(String source, Template template) {
//         if (this.cache == null) {
//             return;
//         }
//         this.cache.put(source, template);
//     }
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/cache/TemplateCache.java
// public interface TemplateCache {
//     Template getTemplate(String source);
// 
//     void putTemplate(String source, Template template);
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/ResourceTemplateLoader.java
// public class ResourceTemplateLoader extends TemplateLoader {
//     private String prefix;
//     private String suffix;
// 
//     @Override
//     public InputStream getTemplateStream(String templateSource) throws TemplateNotFoundException {
//         ClassLoader cl = Thread.currentThread().getContextClassLoader();
//         if (cl == null) {
//             cl = getClass().getClassLoader();
//         }
// 
//         if (prefix != null) {
//             templateSource = prefix + templateSource;
//         }
//         if (suffix != null) {
//             templateSource = templateSource + suffix;
//         }
// 
//         if (templateSource.startsWith("/")) {
//             templateSource = templateSource.replaceAll("^/(.*)", "$1");
//         }
//         InputStream is = cl.getResourceAsStream(templateSource);
//         if (is == null) {
//             throw new TemplateNotFoundException("Can't find template " + templateSource);
//         }
// 
//         return is;
//     }
// 
//     public void setPrefix(String prefix) {
//         this.prefix = prefix;
//     }
// 
//     public void setSuffix(String suffix) {
//         this.suffix = suffix;
//     }
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/TemplateLoader.java
// public abstract class TemplateLoader {
//     public abstract InputStream getTemplateStream(String templateSource) throws TemplateNotFoundException;
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/TemplateNotFoundException.java
// public class TemplateNotFoundException extends RuntimeException {
//     public TemplateNotFoundException(String msg) {
//         super(msg);
//     }
//     
//     public TemplateNotFoundException(String msg, Exception cause) {
//         super(msg, cause);
//     }
// }


import net.unit8.moshas.cache.JCacheTemplateCache;
import net.unit8.moshas.cache.TemplateCache;
import net.unit8.moshas.loader.ResourceTemplateLoader;
import net.unit8.moshas.loader.TemplateLoader;
import net.unit8.moshas.loader.TemplateNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
package net.unit8.moshas;



/**
 *
 * @author kawasima
 */
public class StandardTemplateManager implements TemplateManager {
    private List<TemplateLoader> templateLoaders;
    private final TemplateCache cache;

    public StandardTemplateManager(TemplateCache templateCache) {
        templateLoaders = new ArrayList<>();
        templateLoaders.add(new ResourceTemplateLoader());
        cache = templateCache;
    }

    public StandardTemplateManager() {
        this(new JCacheTemplateCache());
    }

    @Override
    public Template loadTemplate(String templateName) {
        try (InputStream is = findTemplate(templateName)) {
            Template newTemplate = new DefaultTemplate(is);
            return newTemplate;
        } catch (IOException e) {
// Path: moshas/src/main/java/net/unit8/moshas/cache/JCacheTemplateCache.java
// public class JCacheTemplateCache implements TemplateCache {
//     private final Cache<String, Template> cache;
// 
//     public JCacheTemplateCache() {
//         Iterator<CachingProvider> cachingProviders = Caching.getCachingProviders().iterator();
//         if (cachingProviders.hasNext()) {
//             CachingProvider cachingProvider = cachingProviders.next();
//             CacheManager cacheManager = cachingProvider.getCacheManager();
//             Configuration<String, Template> config = new MutableConfiguration<String, Template>()
//                     .setTypes(String.class, Template.class)
//                     .setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 5)));
//             Cache<String, Template> cache = cacheManager.getCache("TemplateCache", String.class, Template.class);
//             if (cache == null) {
//                 this.cache = cacheManager.createCache("TemplateCache", config);
//             } else {
//                 this.cache = cache;
//             }
//         } else {
//             this.cache = null; // to keep compatibility with 0.1.0, but ugly
//         }
//     }
// 
//     @Override
//     public Template getTemplate(String source) {
//         if (this.cache == null) {
//             return null;
//         }
//         return this.cache.get(source);
//     }
// 
//     @Override
//     public void putTemplate(String source, Template template) {
//         if (this.cache == null) {
//             return;
//         }
//         this.cache.put(source, template);
//     }
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/cache/TemplateCache.java
// public interface TemplateCache {
//     Template getTemplate(String source);
// 
//     void putTemplate(String source, Template template);
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/ResourceTemplateLoader.java
// public class ResourceTemplateLoader extends TemplateLoader {
//     private String prefix;
//     private String suffix;
// 
//     @Override
//     public InputStream getTemplateStream(String templateSource) throws TemplateNotFoundException {
//         ClassLoader cl = Thread.currentThread().getContextClassLoader();
//         if (cl == null) {
//             cl = getClass().getClassLoader();
//         }
// 
//         if (prefix != null) {
//             templateSource = prefix + templateSource;
//         }
//         if (suffix != null) {
//             templateSource = templateSource + suffix;
//         }
// 
//         if (templateSource.startsWith("/")) {
//             templateSource = templateSource.replaceAll("^/(.*)", "$1");
//         }
//         InputStream is = cl.getResourceAsStream(templateSource);
//         if (is == null) {
//             throw new TemplateNotFoundException("Can't find template " + templateSource);
//         }
// 
//         return is;
//     }
// 
//     public void setPrefix(String prefix) {
//         this.prefix = prefix;
//     }
// 
//     public void setSuffix(String suffix) {
//         this.suffix = suffix;
//     }
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/TemplateLoader.java
// public abstract class TemplateLoader {
//     public abstract InputStream getTemplateStream(String templateSource) throws TemplateNotFoundException;
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/TemplateNotFoundException.java
// public class TemplateNotFoundException extends RuntimeException {
//     public TemplateNotFoundException(String msg) {
//         super(msg);
//     }
//     
//     public TemplateNotFoundException(String msg, Exception cause) {
//         super(msg, cause);
//     }
// }


// Path: moshas/src/main/java/net/unit8/moshas/StandardTemplateManager.java
import net.unit8.moshas.cache.JCacheTemplateCache;
import net.unit8.moshas.cache.TemplateCache;
import net.unit8.moshas.loader.ResourceTemplateLoader;
import net.unit8.moshas.loader.TemplateLoader;
import net.unit8.moshas.loader.TemplateNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

package net.unit8.moshas;



/**
 *
 * @author kawasima
 */
public class StandardTemplateManager implements TemplateManager {
    private List<TemplateLoader> templateLoaders;
    private final TemplateCache cache;

    public StandardTemplateManager(TemplateCache templateCache) {
        templateLoaders = new ArrayList<>();
        templateLoaders.add(new ResourceTemplateLoader());
        cache = templateCache;
    }

    public StandardTemplateManager() {
        this(new JCacheTemplateCache());
    }

    @Override
    public Template loadTemplate(String templateName) {
        try (InputStream is = findTemplate(templateName)) {
            Template newTemplate = new DefaultTemplate(is);
            return newTemplate;
        } catch (IOException e) {
            throw new TemplateNotFoundException(templateName, e);