@Override public DelegatingLoaderCacheKey createCacheKey(String templateName) { List<Object> keys = new ArrayList<>(); for (Loader<?> loader : this.loaders) { keys.add(loader.createCacheKey(templateName)); } return new DelegatingLoaderCacheKey(keys, templateName); } }
private <T> Reader getReaderInner(Loader<T> delegatingLoader, Object cacheKey) { // This unchecked cast is ok, because we ensure that the type of the // cache key corresponds to the loader when we create the key. @SuppressWarnings("unchecked") T castedKey = (T) cacheKey; return delegatingLoader.getReader(castedKey); }
@Override public void setSuffix(String suffix) { this.suffix = suffix; for (Loader<?> loader: this.loaders) { loader.setSuffix(suffix); } }
@Override public void setPrefix(String prefix) { this.prefix = prefix; for (Loader<?> loader: this.loaders) { loader.setPrefix(prefix); } }
@Override public String resolveRelativePath(String relativePath, String anchorPath) { if (relativePath == null) { return null; } for (Loader<?> loader : this.loaders) { String path = loader.resolveRelativePath(relativePath, anchorPath); if (path != null) { return path; } } return null; }
@Override public void setCharset(String charset) { this.charset = charset; for (Loader<?> loader: this.loaders) { loader.setCharset(charset); } }
@Override public void setSuffix(String suffix) { this.suffix = suffix; for (Loader<?> loader : loaders) { loader.setSuffix(suffix); } }
@Override public void setPrefix(String prefix) { this.prefix = prefix; for (Loader<?> loader : loaders) { loader.setPrefix(prefix); } }
/** * This method resolves the given relative path based on this template file path. * * @param relativePath the path which should be resolved. * @return the resolved path. */ public String resolveRelativePath(String relativePath) { String resolved = this.engine.getLoader().resolveRelativePath(relativePath, this.name); if (resolved == null) { return relativePath; } else { return resolved; } }
@Override public void setCharset(String charset) { this.charset = charset; for (Loader<?> loader : loaders) { loader.setCharset(charset); } }
@Override public void setSuffix(String suffix) { this.suffix = suffix; for (Loader<?> loader: this.loaders) { loader.setSuffix(suffix); } }
@Override public void setPrefix(String prefix) { this.prefix = prefix; for (Loader<?> loader: this.loaders) { loader.setPrefix(prefix); } }
private PebbleTemplate getPebbleTemplate(String templateName, Loader loader, Object cacheKey) { Reader templateReader = loader.getReader(cacheKey); try { LexerImpl lexer = new LexerImpl(this.syntax, this.extensionRegistry.getUnaryOperators().values(), this.extensionRegistry.getBinaryOperators().values()); TokenStream tokenStream = lexer.tokenize(templateReader, templateName); Parser parser = new ParserImpl(this.extensionRegistry.getUnaryOperators(), this.extensionRegistry.getBinaryOperators(), this.extensionRegistry.getTokenParsers(), this.parserOptions); RootNode root = parser.parse(tokenStream); PebbleTemplateImpl instance = new PebbleTemplateImpl(this, root, templateName); for (NodeVisitorFactory visitorFactory : this.extensionRegistry.getNodeVisitors()) { visitorFactory.createVisitor(instance).visit(root); } return instance; } finally { try { templateReader.close(); } catch (IOException e) { // can't do much about it } } }
private PebbleTemplate getTemplate(String templateName, Loader loader) { /* * template name will be null if user uses the extends tag with an * expression that evaluates to null */ if (templateName == null) { return null; } if (loader == null) { throw new LoaderException(null, "Loader has not yet been specified."); } Object cacheKey = loader.createCacheKey(templateName); return this.templateCache .computeIfAbsent(cacheKey, k -> this.getPebbleTemplate(templateName, loader, cacheKey)); }
@Override public String resolveRelativePath(String relativePath, String anchorPath) { if (relativePath == null) { return relativePath; } for (Loader<?> loader : this.loaders) { String path = loader.resolveRelativePath(relativePath, anchorPath); if (path != null) { return path; } } return null; }
@Override public void setCharset(String charset) { this.charset = charset; for (Loader<?> loader: this.loaders) { loader.setCharset(charset); } }
private <T> Reader getReaderInner(Loader<T> delegatingLoader, Object cacheKey) throws LoaderException { // This unchecked cast is ok, because we ensure that the type of the // cache key corresponds to the loader when we create the key. @SuppressWarnings("unchecked") T castedKey = (T) cacheKey; return delegatingLoader.getReader(castedKey); }