package com.psddev.cms.view.servlet; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Objects; import javax.servlet.ServletContext; import com.google.common.base.Preconditions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.psddev.cms.view.UrlViewTemplateLoader; import com.psddev.dari.util.CodeUtils; /** * Loads templates in the servlet context. */ public class ServletViewTemplateLoader extends UrlViewTemplateLoader { private static final String TEMPLATE_NOT_FOUND_MESSAGE_FORMAT = "Could not find template at path [%s]!"; private static final LoadingCache<ServletContext, ServletViewTemplateLoader> INSTANCES = CacheBuilder .newBuilder() .weakKeys() .build(new CacheLoader<ServletContext, ServletViewTemplateLoader>() { @Override @SuppressWarnings("deprecation") public ServletViewTemplateLoader load(ServletContext servletContext) { return new ServletViewTemplateLoader(servletContext); } }); private ServletContext servletContext; /** * Returns an instance that loads templates from the given * {@code servletContext}. * * @param servletContext Nonnull. * @return Nonnull. */ public static ServletViewTemplateLoader getInstance(ServletContext servletContext) { Preconditions.checkNotNull(servletContext); return INSTANCES.getUnchecked(servletContext); } /** * Creates an instance that loads templates from the given * {@code servletContext}. * * @param servletContext Nonnull. * @deprecated Use {@link #getInstance(ServletContext)} instead. */ @Deprecated public ServletViewTemplateLoader(ServletContext servletContext) { Preconditions.checkNotNull(servletContext); this.servletContext = servletContext; } @Override public InputStream getTemplate(String path) throws IOException { InputStream template = CodeUtils.getResourceAsStream(servletContext, path); if (template == null) { throw new IOException(String.format(TEMPLATE_NOT_FOUND_MESSAGE_FORMAT, path)); } return template; } @Override protected URL getTemplateUrl(String path) throws IOException { URL templateUrl = CodeUtils.getResource(servletContext, path); if (templateUrl == null) { throw new IOException(String.format(TEMPLATE_NOT_FOUND_MESSAGE_FORMAT, path)); } return templateUrl; } @Override public int hashCode() { return servletContext.hashCode(); } @Override public boolean equals(Object other) { return this == other || (other instanceof ServletViewTemplateLoader && Objects.equals(servletContext, ((ServletViewTemplateLoader) other).servletContext)); } }