blob: abc7617e15209c8e016df194bb95142300b7b238 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_281) on Sun Jan 15 15:58:33 CET 2023 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TemplateLookupStrategy (FreeMarker 2.3.32 API)</title>
<meta name="date" content="2023-01-15">
<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="TemplateLookupStrategy (FreeMarker 2.3.32 API)";
}
}
catch(err) {
}
//-->
var methods = {"i0":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/TemplateLookupStrategy.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../index-all.html">Index</a></li>
<li><a href="../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../freemarker/cache/TemplateLookupResult.html" title="class in freemarker.cache"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../freemarker/cache/TemplateNameFormat.html" title="class in freemarker.cache"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../index.html?freemarker/cache/TemplateLookupStrategy.html" target="_top">Frames</a></li>
<li><a href="TemplateLookupStrategy.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">freemarker.cache</div>
<h2 title="Class TemplateLookupStrategy" class="title">Class TemplateLookupStrategy</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>freemarker.cache.TemplateLookupStrategy</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public abstract class <span class="typeNameLabel">TemplateLookupStrategy</span>
extends java.lang.Object</pre>
<div class="block">Finds the <a href="../../freemarker/cache/TemplateLoader.html" title="interface in freemarker.cache"><code>TemplateLoader</code></a>-level (storage-level) template source for the template name with which the template
was requested (as in <a href="../../freemarker/template/Configuration.html#getTemplate-java.lang.String-"><code>Configuration.getTemplate(String)</code></a>). This usually means trying various
<a href="../../freemarker/cache/TemplateLoader.html" title="interface in freemarker.cache"><code>TemplateLoader</code></a>-level template names (so called source names; see also <a href="../../freemarker/template/Template.html#getSourceName--"><code>Template.getSourceName()</code></a>) that
were deduced from the requested name. Trying a name usually means calling
<a href="../../freemarker/cache/TemplateLookupContext.html#lookupWithAcquisitionStrategy-java.lang.String-"><code>TemplateLookupContext.lookupWithAcquisitionStrategy(String)</code></a> with it and checking the value of
<a href="../../freemarker/cache/TemplateLookupResult.html#isPositive--"><code>TemplateLookupResult.isPositive()</code></a>.
<p>
Before you write your own lookup strategy, know that:
<ul>
<li>A template lookup strategy meant to operate solely with template names, not with <a href="../../freemarker/cache/TemplateLoader.html" title="interface in freemarker.cache"><code>TemplateLoader</code></a>-s
directly. Basically, it's a mapping between the template names that templates and API-s like
<a href="../../freemarker/template/Configuration.html#getTemplate-java.lang.String-"><code>Configuration.getTemplate(String)</code></a> see, and those that the underlying <a href="../../freemarker/cache/TemplateLoader.html" title="interface in freemarker.cache"><code>TemplateLoader</code></a> sees.
<li>A template lookup strategy doesn't influence the template's name (<a href="../../freemarker/template/Template.html#getName--"><code>Template.getName()</code></a>), which is the
normalized form of the template name as it was requested (with <a href="../../freemarker/template/Configuration.html#getTemplate-java.lang.String-"><code>Configuration.getTemplate(String)</code></a>, etc.). It
only influences the so called source name of the template (<a href="../../freemarker/template/Template.html#getSourceName--"><code>Template.getSourceName()</code></a>). The template's name is
used as the basis for resolving relative inclusions/imports in the template. The source name is pretty much only used
in error messages as error location, and of course, to actually load the template "file".
<li>Understand the impact of the last point if your template lookup strategy fiddles not only with the file name part
of the template name, but also with the directory part. For example, one may want to map "foo.ftl" to "en/foo.ftl",
"fr/foo.ftl", etc. That's legal, but the result is kind of like if you had several root directories ("en/", "fr/",
etc.) that are layered over each other to form a single merged directory. (This is what's desirable in typical
applications, yet it can be confusing.)
</ul></div>
<dl>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>2.3.22</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../freemarker/template/Configuration.html#setTemplateLookupStrategy-freemarker.cache.TemplateLookupStrategy-"><code>Configuration.setTemplateLookupStrategy(TemplateLookupStrategy)</code></a></dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- =========== FIELD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="field.summary">
<!-- -->
</a>
<h3>Field Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Field and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static <a href="../../freemarker/cache/TemplateLookupStrategy.html" title="class in freemarker.cache">TemplateLookupStrategy</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../freemarker/cache/TemplateLookupStrategy.html#DEFAULT_2_3_0">DEFAULT_2_3_0</a></span></code>
<div class="block">
The default lookup strategy of FreeMarker.</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../freemarker/cache/TemplateLookupStrategy.html#TemplateLookupStrategy--">TemplateLookupStrategy</a></span>()</code>&nbsp;</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>abstract <a href="../../freemarker/cache/TemplateLookupResult.html" title="class in freemarker.cache">TemplateLookupResult</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../freemarker/cache/TemplateLookupStrategy.html#lookup-freemarker.cache.TemplateLookupContext-">lookup</a></span>(<a href="../../freemarker/cache/TemplateLookupContext.html" title="class in freemarker.cache">TemplateLookupContext</a>&nbsp;ctx)</code>
<div class="block">Finds the template source that matches the template name, locale (if not <code>null</code>) and other parameters
specified in the <a href="../../freemarker/cache/TemplateLookupContext.html" title="class in freemarker.cache"><code>TemplateLookupContext</code></a>.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ FIELD DETAIL =========== -->
<ul class="blockList">
<li class="blockList"><a name="field.detail">
<!-- -->
</a>
<h3>Field Detail</h3>
<a name="DEFAULT_2_3_0">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>DEFAULT_2_3_0</h4>
<pre>public static final&nbsp;<a href="../../freemarker/cache/TemplateLookupStrategy.html" title="class in freemarker.cache">TemplateLookupStrategy</a> DEFAULT_2_3_0</pre>
<div class="block"><p>
The default lookup strategy of FreeMarker.
<p>
Through an example: Assuming localized lookup is enabled and that a template is requested for the name
<code>example.ftl</code> and <code>Locale("es", "ES", "Traditional_WIN")</code>, it will try the following template names,
in this order: <code>"foo_en_AU_Traditional_WIN.ftl"</code>, <code>"foo_en_AU_Traditional.ftl"</code>,
<code>"foo_en_AU.ftl"</code>, <code>"foo_en.ftl"</code>, <code>"foo.ftl"</code>. It stops at the first variation where it finds
a template. (If the template name contains "*" steps, finding the template for the attempted localized variation
happens with the template acquisition mechanism.) If localized lookup is disabled, it won't try to add any locale
strings, so it just looks for <code>"foo.ftl"</code>.
<p>
The generation of the localized name variation with the default lookup strategy, happens like this: It removes
the file extension (the part starting with the <em>last</em> dot), then appends <code>Locale.toString()</code> after
it, and puts back the extension. Then it starts to remove the parts from the end of the locale, considering
<code>"_"</code> as the separator between the parts. It won't remove parts that are not part of the locale string
(like if the requested template name is <code>foo_bar.ftl</code>, it won't remove the <code>"_bar"</code>).</div>
</li>
</ul>
</li>
</ul>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a name="TemplateLookupStrategy--">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>TemplateLookupStrategy</h4>
<pre>public&nbsp;TemplateLookupStrategy()</pre>
</li>
</ul>
</li>
</ul>
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="lookup-freemarker.cache.TemplateLookupContext-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>lookup</h4>
<pre>public abstract&nbsp;<a href="../../freemarker/cache/TemplateLookupResult.html" title="class in freemarker.cache">TemplateLookupResult</a>&nbsp;lookup(<a href="../../freemarker/cache/TemplateLookupContext.html" title="class in freemarker.cache">TemplateLookupContext</a>&nbsp;ctx)
throws java.io.IOException</pre>
<div class="block">Finds the template source that matches the template name, locale (if not <code>null</code>) and other parameters
specified in the <a href="../../freemarker/cache/TemplateLookupContext.html" title="class in freemarker.cache"><code>TemplateLookupContext</code></a>. See also the class-level <a href="../../freemarker/cache/TemplateLookupStrategy.html" title="class in freemarker.cache"><code>TemplateLookupStrategy</code></a>
documentation to understand lookup strategies more.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>ctx</code> - Contains the parameters for which the matching template need to be found, and operations that
are needed to implement the strategy. Some of the important input parameters are:
<a href="../../freemarker/cache/TemplateLookupContext.html#getTemplateName--"><code>TemplateLookupContext.getTemplateName()</code></a>, <a href="../../freemarker/cache/TemplateLookupContext.html#getTemplateLocale--"><code>TemplateLookupContext.getTemplateLocale()</code></a>.
The most important operations are <a href="../../freemarker/cache/TemplateLookupContext.html#lookupWithAcquisitionStrategy-java.lang.String-"><code>TemplateLookupContext.lookupWithAcquisitionStrategy(String)</code></a>
and <a href="../../freemarker/cache/TemplateLookupContext.html#createNegativeLookupResult--"><code>TemplateLookupContext.createNegativeLookupResult()</code></a>. (Note that you deliberately can't
use <a href="../../freemarker/cache/TemplateLoader.html" title="interface in freemarker.cache"><code>TemplateLoader</code></a>-s directly to implement lookup.)</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>Usually the return value of <a href="../../freemarker/cache/TemplateLookupContext.html#lookupWithAcquisitionStrategy-java.lang.String-"><code>TemplateLookupContext.lookupWithAcquisitionStrategy(String)</code></a>, or
<code>TemplateLookupContext#createNegativeLookupResult()</code> if no matching template exists. Can't be
<code>null</code>.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.io.IOException</code></dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/TemplateLookupStrategy.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../index-all.html">Index</a></li>
<li><a href="../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../freemarker/cache/TemplateLookupResult.html" title="class in freemarker.cache"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../freemarker/cache/TemplateNameFormat.html" title="class in freemarker.cache"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../index.html?freemarker/cache/TemplateLookupStrategy.html" target="_top">Frames</a></li>
<li><a href="TemplateLookupStrategy.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>