You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/03/13 10:57:44 UTC

[08/50] incubator-freemarker-site git commit: 2.3.26-nightly docs preview

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-site/blob/52c070a9/builds/2.3.26-nightly/versions_2_3_20.html
----------------------------------------------------------------------
diff --git a/builds/2.3.26-nightly/versions_2_3_20.html b/builds/2.3.26-nightly/versions_2_3_20.html
new file mode 100644
index 0000000..3170642
--- /dev/null
+++ b/builds/2.3.26-nightly/versions_2_3_20.html
@@ -0,0 +1,691 @@
+<!doctype html>
+<!-- Generated by FreeMarker/Docgen from DocBook -->
+<html lang="en" class="page-type-section">
+<head prefix="og: http://ogp.me/ns#">
+<meta charset="utf-8">
+<title>2.3.20 - Apache FreeMarker Manual</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="format-detection" content="telephone=no">
+<meta property="og:site_name" content="Apache FreeMarker Manual">
+<meta property="og:title" content="2.3.20">
+<meta property="og:locale" content="en_US">
+<meta property="og:url" content="http://freemarker.org/docs/versions_2_3_20.html">
+<link rel="canonical" href="http://freemarker.org/docs/versions_2_3_20.html">
+<link rel="icon" href="favicon.png" type="image/png">
+<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Roboto:500,700,400,300|Droid+Sans+Mono">
+<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css?1489402528979">
+<script>
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ga('create', 'UA-55420501-1', 'auto');
+ga('send', 'pageview');
+</script>
+</head>
+<body itemscope itemtype="https://schema.org/Code">
+    <meta itemprop="url" content="http://freemarker.org/docs/">
+    <meta itemprop="name" content="Apache FreeMarker Manual">
+
+  <!--[if lte IE 9]>
+  <div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
+  <![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://freemarker.org" role="banner">            <img itemprop="image" src="logo.png" alt="FreeMarker">
+</a><ul class="tabs"><li><a href="http://freemarker.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="http://freemarker.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://issues.apache.org/jira/browse/FREEMARKER/" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="http://freemarker.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="index.html" class="navigation-header">Manual</a><div class="navigation-header"></div><form method="get" class="search-form" action="search-results.html"><fieldset><legend class="sr-only">Search form</legend><label for="search-field" class="sr-only">Search query</label><input id="searc
 h-field" name="q" type="search" class="search-input" placeholder="Search" spellcheck="false" autocorrect="off" autocomplete="off"><button type="submit" class="search-btn"><span class="sr-only">Search</span></button></fieldset></form></div><div class="site-width breadcrumb-row"><ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="index.html"><span itemprop="name">Apache FreeMarker Manual</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app.html"><span itemprop="name">Appendixes</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app_versions.html"><span itemprop="name">Version history</span></a></li><li class="step-3" itemprop="itemListEl
 ement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="versions_2_3_20.html"><span itemprop="name">2.3.20</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div>    <div class="main-content site-width">
+      <div class="content-wrapper">
+  <div id="table-of-contents-wrapper" class="col-left">
+      <script>var breadcrumb = ["Apache FreeMarker Manual","Appendixes","Version history","2.3.20"];</script>
+      <script src="toc.js?1489402528979"></script>
+      <script src="docgen-resources/main.min.js?1489402528979"></script>
+  </div>
+<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="versions_2_3_21.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_19.html"><span>Next</span></a></div><div class="title-wrapper">
+<h1 class="content-header header-section1" id="versions_2_3_20" itemprop="headline">2.3.20</h1>
+</div></div><div class="page-menu">
+<div class="page-menu-title">Page Contents</div>
+<ul><li><a class="page-menu-link" href="#autoid_174" data-menu-target="autoid_174">Changes on the FTL side</a></li><li><a class="page-menu-link" href="#autoid_175" data-menu-target="autoid_175">Changes on the Java side</a></li><li><a class="page-menu-link" href="#autoid_176" data-menu-target="autoid_176">Other changes</a></li></ul> </div><p>Date of release: 2013-06-27</p><p>If you are IDE/tools author, <a href="#version_2_3_20_ide">note these changes</a>.</p>
+          
+
+
+
+<h2 class="content-header header-section2" id="autoid_174">Changes on the FTL side</h2>
+
+
+          <ul>
+            <li>
+              <p>Error message quality improvements:</p>
+
+              <ul>
+                <li>
+                  <p>Many error messages are now more helpful, especially
+                  for users who are not experienced with FreeMarker. For
+                  example, some of the most common user mistakes are
+                  recognized and tips are shown to fix them, reducing support
+                  costs or the time employees spend to figure them out.</p>
+                </li>
+
+                <li>
+                  <p>It&#39;s now ensured that the error location in the
+                  template is included in the message returned by
+                  <code class="inline-code">TemplateException.getMessage()</code>. The stack
+                  trace always showed this information anyway, but some users
+                  only see the "message", not the stack trace,
+                  and that often didn&#39;t contained the location.</p>
+                </li>
+
+                <li>
+                  <p>The template language part of the stack trace is now
+                  more detailed, and easier to understand. This is especially
+                  helpful in applications that use a complex library of macros
+                  and functions.</p>
+                </li>
+
+                <li>
+                  <p>Several smaller bugs were fixed that made the error
+                  information wrong or lacking.</p>
+                </li>
+
+                <li>
+                  <p>The layout of the error messages is now more
+                  consistent, and generally easier to read.</p>
+                </li>
+              </ul>
+            </li>
+
+            <li>
+              <p>Changes regarding boolean to string conversions and
+              formatting:</p>
+
+              <ul>
+                <li>
+                  <p><code class="inline-code">?c</code> (computer-language formatting)
+                  now works with booleans too, always giving
+                  <code class="inline-code">&quot;true&quot;</code> or <code class="inline-code">&quot;false&quot;</code>
+                  regardless of the <code class="inline-code">boolean_format</code>. This
+                  way it&#39;s safe for generating JavaScript in a context where
+                  human-readable text is also rendered.</p>
+                </li>
+
+                <li>
+                  <p>If the <code class="inline-code">boolean_format</code> setting is
+                  set to anything but the default
+                  <code class="inline-code">&quot;true,false&quot;</code> value, boolean values will
+                  be automatically converted to string where a string value is
+                  expected by the template language, instead of giving an
+                  error. This helps you spare
+                  those<code class="inline-code">?string</code>-s after boolean values. This
+                  is the same logic as with numbers and dates, which were
+                  always automatically converted to string, according the
+                  corresponding format setting. Except, the provided default
+                  boolean format is useless for automatic conversion (but it&#39;s
+                  still there for <code class="inline-code">?string</code>, for backward
+                  compatibility), hence it must be set manually. (We certainly
+                  couldn&#39;t come up with a sensible default anyway, as for
+                  booleans it depends too much on the application, not to
+                  mention the localisation issues.)</p>
+
+                  <p>Exactly like with numbers and dates, automatic
+                  conversion doesn&#39;t happen in these cases:</p>
+
+                  <ul>
+                    <li>
+                      <p>Comparisons, i.e., <code class="inline-code">someBoolean ==
+                      &#39;true&#39;</code> is still an error</p>
+                    </li>
+
+                    <li>
+                      <p>Method calls where the declared type of the
+                      parameter is <code class="inline-code">String</code> but the actual
+                      value is a boolean; still an error</p>
+                    </li>
+
+                    <li>
+                      <p>When the boolean value is used as key in
+                      <code class="inline-code"><em class="code-color">expr</em>[<em class="code-color">key</em>]</code>,
+                      it&#39;s still an error (there was no automatic conversion
+                      there for other types either, as numerical and string
+                      keys have different meaning)</p>
+                    </li>
+
+                    <li>
+                      <p>The opposite direction, i.e., string to boolean
+                      conversion; won&#39;t happen</p>
+                    </li>
+                  </ul>
+                </li>
+              </ul>
+            </li>
+
+            <li>
+              <p>New built-ins for numbers: <a href="ref_builtins_number.html#ref_builtin_abs"><code>abs</code></a>, <a href="ref_builtins_number.html#ref_builtin_is_nan"><code>is_nan</code></a>,
+              <a href="ref_builtins_number.html#ref_builtin_is_infinite"><code>is_infinite</code></a>.
+              Like <code class="inline-code">n?abs</code> will give the absolute value of
+              <code class="inline-code">n</code>.</p>
+            </li>
+
+            <li>
+              <p>New built-in for sequences: <a href="ref_builtins_sequence.html#ref_builtin_join"><code>join</code></a>. Like
+              <code class="inline-code">[1, 2, 3]?join(&quot;, &quot;)</code> will give the string
+              <code class="inline-code">&quot;1, 2, 3&quot;</code>.</p>
+            </li>
+
+            <li>
+              <p>If you set the
+              <code class="inline-code">incompatible_improvements</code> setting (see <a href="http://freemarker.org/docs/api/freemarker/template/Configuration.html#setIncompatibleImprovements%28freemarker.core.Version%29">here</a>)
+              to <code class="inline-code">2.3.20</code> or higher, <code class="inline-code">?html</code>
+              will escape apostrophe-quotes just like
+              <code class="inline-code">?xhtml</code> does. Utilizing this is highly
+              recommended, because otherwise if interpolations are used inside
+              attribute values that use apostrophe-quotation (<code class="inline-code">&lt;foo
+              bar=&#39;${val}&#39;&gt;</code>) instead of plain quotation mark
+              (<code class="inline-code">&lt;foo bar=&quot;${val}&quot;&gt;</code>), they might
+              produce HTML/XML that&#39;s not well-formed. Note that
+              <code class="inline-code">?html</code> didn&#39;t do this because long ago there
+              was no cross-browser way of doing this, but it&#39;s not a real
+              concern anymore. Also note that this will be the default
+              behavior starting from 2.4.</p>
+            </li>
+
+            <li>
+              <p>Bug fix [<a href="https://sourceforge.net/p/freemarker/bugs/390/">390</a>]
+              (and other improvements): <code class="inline-code">?js_string</code> and
+              <code class="inline-code">?json_string</code> didn&#39;t escape the
+              <code class="inline-code">u2028</code>-<code class="inline-code">u2029</code> line
+              terminators (problem for JavaScript) and the
+              <code class="inline-code">u007F</code>-<code class="inline-code">u009F</code> control
+              characters (maybe a problem in JSON, depending on
+              implementation). Furthermore, the escaping of
+              <code class="inline-code">\</code>, <code class="inline-code">&lt;</code>, and
+              <code class="inline-code">&gt;</code> become safer in that now they are
+              escaped whenever it can&#39;t be guaranteed that they won&#39;t be part
+              of <code class="inline-code">&lt;!</code>, <code class="inline-code">]]&gt;</code> or
+              <code class="inline-code">&lt;/</code>. Earlier they were only escaped when it
+              was known that they are part of these patterns, thus it was
+              possible to assemble these patterns from two adjacent
+              interpolations. Additionally, from now on
+              <code class="inline-code">&lt;?</code> and <code class="inline-code">--&gt;</code> also
+              count as dangerous patterns, and will trigger
+              <code class="inline-code">&lt;</code> and <code class="inline-code">&gt;</code>
+              escaping.</p>
+            </li>
+
+            <li>
+              <p>Bug fixed: The following string built-ins didn&#39;t coerce
+              the numerical, date (and now the boolean) left-values to string,
+              instead they threw a type error: contains,
+              <code class="inline-code">index_of</code>, <code class="inline-code">last_index_of</code>,
+              <code class="inline-code">left_pad</code>, <code class="inline-code">right_pad</code>,
+              <code class="inline-code">matches</code>, <code class="inline-code">replace</code>,
+              <code class="inline-code">split</code>, <code class="inline-code">new</code>. The other
+              string built-ins already did this conversion for a long time;
+              this was an accidental inconsistency.</p>
+            </li>
+
+            <li>
+              <p>Bug fixed: With the default arithmetic engine, it&#39;s now
+              supported to compare infinite (positive or negative) with 0, to
+              decide its sign.</p>
+            </li>
+          </ul>
+        
+          
+
+
+
+<h2 class="content-header header-section2" id="autoid_175">Changes on the Java side</h2>
+
+
+          <ul>
+            <li>
+              <p><code class="inline-code">BeansWrapper</code> introspection cache
+              improvements:</p>
+
+              <ul>
+                <li>
+                  <p>Added public API to <code class="inline-code">BeansWrapper</code>
+                  for clearing the class cache:
+                  <code class="inline-code">clearClassIntrospecitonCache()</code>,
+                  <code class="inline-code">removeFromClassIntrospectionCache(Class)</code></p>
+                </li>
+
+                <li>
+                  <p>Significantly improved multi-core performance:</p>
+
+                  <ul>
+                    <li>
+                      <p>Uses <code class="inline-code">ConcurrentHashMap</code> when
+                      running on Java 5 or later.</p>
+                    </li>
+
+                    <li>
+                      <p>The cache won&#39;t block readers while introspecting
+                      a class after a cache miss</p>
+                    </li>
+
+                    <li>
+                      <p>If multiple threads need to introspect the same
+                      class that&#39;s not in the cache yet, only one of them will
+                      do it, the others will wait for its results.</p>
+                    </li>
+                  </ul>
+                </li>
+
+                <li>
+                  <p>Bug fix [<a href="https://sourceforge.net/p/freemarker/bugs/361/">361</a>]:
+                  There was a small chance of deadlock when class-reloading
+                  was detected. Locking was redesigned to prevent such
+                  oversights in the future.</p>
+                </li>
+
+                <li>
+                  <p>The internal package-visible
+                  <code class="inline-code">freemarker.ext.beans</code> API was slightly
+                  changed as the result of internal cleanup. Nobody but the
+                  FreeMarker developers should define classes in that package,
+                  so it shouldn&#39;t break anything. But if somebody did some
+                  in-house hacks there, re-compile to see if it still
+                  works.</p>
+                </li>
+              </ul>
+            </li>
+
+            <li>
+              <p>Nameless templates (those directly created with
+              <code class="inline-code">new Template(null,
+              <em class="code-color">...</em>)</code> instead of loaded
+              through <code class="inline-code">Configuration</code>) couldn&#39;t include or
+              import other templates, and thrown a
+              <code class="inline-code">NullPointerException</code> when they tried to. Now
+              they resolve relative paths as if they were in the template root
+              directory.</p>
+            </li>
+
+            <li>
+              <p>Bug fix: Regular expression built-ins and some logger
+              libraries (most importantly Log4J) were unavailable on the
+              Google App Engine platform. This fix is only present in the
+              GAE-compatible build, 2.3.20-gae.</p>
+            </li>
+
+            <li>
+              <p>Added new method to <code class="inline-code">Configuration</code>:
+              <code class="inline-code">CacheStorage getCacheStorage()</code></p>
+            </li>
+
+            <li>
+              <p>Added new methods to <code class="inline-code">Environment</code> to
+              make comparisons among <code class="inline-code">TemplateModel</code>-s
+              according the rules of the template language operators:
+              <code class="inline-code">applyEqualsOperator</code>,
+              <code class="inline-code">applyEqualsOperatorLenient</code>,
+              <code class="inline-code">applyLessThanOperator</code>,
+              <code class="inline-code">applyLessThanOrEqualsOperator</code>,
+              <code class="inline-code">applyGreaterThanOperator</code>,
+              <code class="inline-code">applyWithGreaterThanOrEqualsOperator</code></p>
+            </li>
+
+            <li>
+              <p>Added new method,
+              <code class="inline-code">Environment.isInAttemptBlock()</code> to check if we
+              are within an <code class="inline-code">#attempt</code> block. This can be
+              useful for <code class="inline-code">TemplateExceptionHandler</code>-s, as
+              then they don&#39;t need to print the error to the output since
+              <code class="inline-code">#attempt</code> will roll it back anyway. This is
+              already utilized by the built-in
+              <code class="inline-code">TemplateExceptionHandler</code>-s
+              (<code class="inline-code">DEBUG_HANDLER</code> and
+              <code class="inline-code">HTML_DEBUG_HANDLER</code>).</p>
+            </li>
+
+            <li>
+              <p>Added convenience constructor <code class="inline-code">Template(String
+              name, String sourceCode, Configuration cfg)</code>.</p>
+            </li>
+
+            <li>
+              <p><code class="inline-code">TemplateException</code>-s and
+              <code class="inline-code">TemplateModelExcepton</code>-s now can have
+              <code class="inline-code">Throwable</code> cause, not just
+              <code class="inline-code">Exception</code> (it was an old oversight that
+              somehow wasn&#39;t fixed so far).</p>
+            </li>
+
+            <li>
+              <p>Parsing error messages under the JBoss Tools FreeMarker
+              IDE now doesn&#39;t contain the usual location line, so that the
+              actual error description is immediately visible in the Eclipse
+              "Problems" view. (It&#39;s a "hack" in
+              FreeMarler itself; it tries to detect if it runs under the
+              plugin and then changes its behavior.)</p>
+            </li>
+
+            <li>
+              <p><a name="version_2_3_20_ide"></a>Mostly concerning tool (like IDE plugin) authors:</p>
+
+              <ul>
+                <li>
+                  <p>The error message formats (what
+                  <code class="inline-code">Throwable.getMessage()</code> returns) were
+                  heavily changed for <code class="inline-code">TemplateException</code>-s,
+                  and somewhat for <code class="inline-code">ParseException</code>-s. It&#39;s
+                  unlikely that anybody depends on these, but if you tried to
+                  parse these messages, be aware of this.</p>
+                </li>
+
+                <li>
+                  <p>Fixed bug where <code class="inline-code">ParseException</code> has
+                  contained 0 as line and column number for lexical errors.
+                  Now it contains the correct information.</p>
+                </li>
+
+                <li>
+                  <p>Added
+                  <code class="inline-code">ParseException.getEditorMessage()</code>: As in
+                  IDE-s the error markers show the error location to the user
+                  already, the location should not be repeated in the error
+                  message. So in IDE-s you should use this method instead of
+                  <code class="inline-code">getMessage()</code>. (Under JBoss Tools:
+                  FreeMarker now <em>tries</em> to detect that it
+                  runs under the plugin, and then it already does this, except
+                  that it still shows the column number as that&#39;s missing from
+                  the error marker location.)</p>
+                </li>
+
+                <li>
+                  <p>Added
+                  <code class="inline-code">ParseException.getTemplateName()</code></p>
+                </li>
+
+                <li>
+                  <p>Added
+                  <code class="inline-code">Configuration.getSupportedBuiltInNames()</code>.
+                  As new built-ins
+                  (<code class="inline-code"><em class="code-color">expr</em>?<em class="code-color">builtin_name</em></code>)
+                  are very often added to new FreeMarker versions,
+                  auto-completion or syntax highlighting should use this set
+                  instead of a fixed set of a names.</p>
+                </li>
+
+                <li>
+                  <p>The format returned by
+                  <code class="inline-code">TemplateElement.getDescription()</code> was
+                  heavily changed. It&#39;s what FTL stack traces and maybe some
+                  outline views (tree-views) show. It was always for human
+                  reading (and till now was too inconsistent for anything
+                  else), so it&#39;s unlikely that this breaks anything.</p>
+                </li>
+
+                <li>
+                  <p>There were some smaller changes in
+                  <code class="inline-code">freemarker.debug</code>, and it&#39;s expected that
+                  there will be more, so it was marked as experimental. As far
+                  as we know, nobody used it, so it shouldn&#39;t break
+                  anything.</p>
+                </li>
+              </ul>
+            </li>
+
+            <li>
+              <p>In <em>experimental status only</em>, but
+              <code class="inline-code">freemarker.jar</code> is now an OSGi bundle (see
+              <code class="inline-code">freemarker.jar/META-INF/MANIFEST.MF</code>).
+              Depending on user feedback, the bundle description may change in
+              the future. So please give feedback, especially if you are an
+              OSGi expert!</p>
+            </li>
+
+            <li>
+              <p>Improved the HTML generated by
+              <code class="inline-code">HTML_DEBUG_HANDLER</code> (the
+              red-on-yellow-background error message). Most importantly, now
+              it will word-wrap. Other changes are minor, like now it can
+              break out of CDATA sections, or now it has less intense
+              colors.</p>
+            </li>
+
+            <li>
+              <p>New <code class="inline-code">Template</code> method,
+              <code class="inline-code">getActualTagSyntax()</code>: Tells if the template
+              is using traditional or square-bracket syntax. As the syntax can
+              be overridden in the template, also it&#39;s possibly decided by
+              auto-detection, it wasn&#39;t trivial to it tell till now.</p>
+            </li>
+
+            <li>
+              <p>Added some utility methods that are useful for generating
+              error messages in custom directives:
+              <code class="inline-code">ClassUtil.getFTLTypeDescription(TemplateModel)</code>,
+              <code class="inline-code">getShortClassName</code>,
+              <code class="inline-code">getShortClassNameOfObject</code></p>
+            </li>
+
+            <li>
+              <p>Bug fix [<a href="https://sourceforge.net/p/freemarker/bugs/364/">364</a>]:
+              <code class="inline-code">freemarker.template.EmptyMap</code> (which is passed
+              to <code class="inline-code">TemplateDirectiveModel</code>-s if there are no
+              parameters) now allows <code class="inline-code">remove(key)</code>,
+              <code class="inline-code">clear()</code> and
+              <code class="inline-code">putAll(anyEmptyMap)</code> as these do nothing
+              anyway.</p>
+            </li>
+
+            <li>
+              <p>Bug fix [<a href="https://sourceforge.net/p/freemarker/bugs/375/">375</a>]:
+              <code class="inline-code">NullPointerException</code> on IBM J9 VM (not on the
+              Sun/Oracle implementation) in <code class="inline-code">BeansWrapper</code>
+              when the Java implementation legally returns
+              <code class="inline-code">null</code> for some <code class="inline-code">BeanInfo</code>
+              getters.</p>
+            </li>
+
+            <li>
+              <p>Bug fix: Cloning a <code class="inline-code">Configuration</code> didn&#39;t
+              deep-clone the data structures storing the
+              <code class="inline-code">auto_imports</code> and
+              <code class="inline-code">auto_includes</code> settings, hence possibly
+              leading to aliasing problems.</p>
+            </li>
+
+            <li>
+              <p>Bug fix [<a href="https://sourceforge.net/p/freemarker/bugs/377/">377</a>]:
+              After a failed method call the exception handler could fail in
+              the rare occasion when
+              <code class="inline-code">targetObject.toString()</code> fails, raising a
+              runtime exception that not even the <code class="inline-code">attempt</code>
+              directive will catch.</p>
+            </li>
+
+            <li>
+              <p>Bug fix [<a href="https://sourceforge.net/p/freemarker/bugs/391/">391</a>]:
+              If a template name has contained <code class="inline-code">*</code> that was
+              not the only character in the path step, it threw
+              <code class="inline-code">NegativeArraySizeException</code> instead of
+              <code class="inline-code">FileNotFoundException</code>.</p>
+            </li>
+
+            <li>
+              <p>With the default arithmetic engine, performance
+              optimizations of comparison operations when some of the numbers
+              is 0, and when the sign of the numbers differ.</p>
+            </li>
+
+            <li>
+              <p>Some smaller fixes in
+              <code class="inline-code">TemplateElement.getCanonicalForm()</code>, also some
+              quality improvements there.</p>
+            </li>
+
+            <li>
+              <p>Bug fixes in <code class="inline-code">classic_compatible</code> mode
+              (this mode is to help migrating from FreeMarker 1), thanks to
+              Information Mosaic:</p>
+
+              <ul>
+                <li>
+                  <p>When a macro was called with a
+                  <code class="inline-code">null</code>/missing parameter value, it has
+                  caused error like in FreeMarker 2.3</p>
+                </li>
+
+                <li>
+                  <p>When a hash literal contained reference to a
+                  <code class="inline-code">null</code>/missing variable, like in <code class="inline-code">{
+                  &#39;a&#39;: missingVar }</code>, it has caused an error like in
+                  2.3</p>
+                </li>
+
+                <li>
+                  <p>When a sequence literal contained reference to a
+                  <code class="inline-code">null</code>/missing variable, like in
+                  <code class="inline-code">[1, missingVar]</code>, it has caused an error
+                  like in 2.3</p>
+                </li>
+
+                <li>
+                  <p>When a the left-side of the <code class="inline-code">.</code> (dot)
+                  or <code class="inline-code">[<em class="code-color">key</em>]</code>
+                  operator was <code class="inline-code">null</code> or missing variable,
+                  like in <code class="inline-code">missingVar.subVar</code>, it has caused
+                  an error like in 2.3</p>
+                </li>
+
+                <li>
+                  <p>When <code class="inline-code">BeanModel</code>-s are tried to be
+                  treated as strings, for most subclasses it has failed with
+                  type error, like in 2.3. In FreeMarker 1 all
+                  <code class="inline-code">BeanModel</code>-s were
+                  <code class="inline-code">TemplateScalarModel</code>-s, so it should
+                  succeed. The fix for this only works where FreeMarker
+                  <em>coerces</em> to string (string built-ins on
+                  the left-side and concatenation (<code class="inline-code">+</code>) and
+                  interpolation
+                  (<code class="inline-code">${<em class="code-color">...</em>}</code>) do
+                  that), otherwise unfortunately it will still fail.</p>
+                </li>
+
+                <li>
+                  <p>The <code class="inline-code">classic_compatible</code> setting now
+                  accepts value <code class="inline-code">2</code> along
+                  <code class="inline-code">true</code> (alias <code class="inline-code">1</code>) and
+                  <code class="inline-code">false</code> (alias <code class="inline-code">0</code>).
+                  <code class="inline-code">2</code> means <code class="inline-code">true</code> but with
+                  emulating bugs in early 2.x classic-compatibility mode.
+                  Currently this only affects how booleans are converted to
+                  string; with <code class="inline-code">1</code> it&#39;s always
+                  <code class="inline-code">&quot;true&quot;</code>/<code class="inline-code">&quot;&quot;</code>, but with
+                  <code class="inline-code">2</code> it&#39;s <code class="inline-code">&quot;true&quot;/&quot;false&quot;</code>
+                  for values wrapped by <code class="inline-code">BeansWrapper</code> as
+                  then <code class="inline-code">Boolean.toString()</code> prevails. Note
+                  that
+                  <code class="inline-code"><em class="code-color">someBoolean</em>?string</code>
+                  will always consistently format the boolean according the
+                  <code class="inline-code">boolean_format</code> setting, just like in
+                  FreeMarker 2.3.</p>
+                </li>
+              </ul>
+            </li>
+
+            <li>
+              <p>Bug fix [<a href="https://sourceforge.net/p/freemarker/bugs/394/">394</a>]:
+              When trying to access the optional Jython (or W3C DOM) classes
+              has failed in <code class="inline-code">DefaultObjectWrapper</code> with an
+              <code class="inline-code">Error</code>, rather than with an
+              <code class="inline-code">Exception</code>, loading the
+              <code class="inline-code">DefaultObjectWrapper</code> class itself has failed,
+              instead of the Jython (or W3C DOM) support being disabled. From
+              now in, it will survive any kind of <code class="inline-code">Throwable</code>
+              there, and if the <code class="inline-code">Throwable</code> is not an
+              <code class="inline-code">ClassNotFoundException</code>, it will also log the
+              <code class="inline-code">Throwable</code>.</p>
+            </li>
+
+            <li>
+              <p>Improved the performance of
+              <code class="inline-code">(thisVarIsMissing.foo)!default</code> and similar
+              <em>parenthetical</em> existence operators and
+              existence built-ins in the case when the
+              <code class="inline-code">null</code>/missing variable is not the last step
+              inside the parenthesis. In that case it&#39;s about 30 times faster
+              now, measured on Java 6. In other cases (when all variables
+              exists, or the the last step is missing) the performance is
+              about the same (relatively fast) as before.</p>
+            </li>
+
+            <li>
+              <p>Added interface
+              <code class="inline-code">freemarker.cache.CacheStorageWithGetSize</code>
+              which allows querying the current number of cache entries in a
+              <code class="inline-code">CacheStorage</code> that implements it. It&#39;s
+              implemented by all out-of-the-box
+              <code class="inline-code">CacheStorage</code> implementations. Also added
+              <code class="inline-code">getStrongSize()</code> and
+              <code class="inline-code">getSoftSize()</code> to
+              <code class="inline-code">MRUCacheStorage</code>.</p>
+            </li>
+
+            <li>
+              <p>Version and build information changes:</p>
+
+              <ul>
+                <li>
+                  <p>The form of the nightly build version numbers has
+                  changed to be Maven/JSR 277 compliant. What earlier was
+                  <code class="inline-code">2.3.19mod</code> is now something like
+                  <code class="inline-code">2.3.20-nightly_20130605T130506Z</code> (note how
+                  the last points to the target release version instead of the
+                  last release version).</p>
+                </li>
+
+                <li>
+                  <p>The form of the Release Candidate and Preview version
+                  numbers where changed to be Maven/JSP 277 compliant:
+                  <code class="inline-code">2.4pre2</code> is now
+                  <code class="inline-code">2.4.0-pre02</code>, <code class="inline-code">2.4rc1</code> is
+                  now <code class="inline-code">2.4.0-rc01</code>.</p>
+                </li>
+
+                <li>
+                  <p>Added new static method to
+                  <code class="inline-code">Configuration</code> to query build date:
+                  <code class="inline-code">getBuildDate()</code>. This is also printed by
+                  the main command line class.</p>
+                </li>
+              </ul>
+            </li>
+
+            <li>
+              <p>Various internal code cleanups.</p>
+            </li>
+          </ul>
+        
+          
+
+
+
+<h2 class="content-header header-section2" id="autoid_176">Other changes</h2>
+
+
+          <ul>
+            <li>
+              <p>Many JavaDoc improvements, mostly in the documentation of
+              the basic (most frequently used) classes.</p>
+            </li>
+
+            <li>
+              <p>FreeMarker source code has moved to GitHub (<a href="???">https://github.com/freemarker/freemarker</a>),
+              other project resources has remained on sourceforge.net.</p>
+            </li>
+
+            <li>
+              <p>Project structure cleanup, Ivy-based build script.</p>
+            </li>
+          </ul>
+        <div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="versions_2_3_21.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_19.html"><span>Next</span></a></div></div></div></div>      </div>
+    </div>
+<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="http://freemarker.org/">What is FreeMarker?</a></li><li><a href="http://freemarker.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="http://freemarker.org/history.html">About us</a></li><li><a itemprop="license" href="app_license.html">License</a></li></ul></div><div class="column"><h3 class="column-header">Handy stuff</h3><ul><li><a href="http://freemarker-online.kenshoo.com/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href
 ="https://github.com/freemarker/freemarker">FreeMarker on Github</a></li><li><a href="https://twitter.com/freemarker">Follow us on Twitter</a></li><li><a href="https://issues.apache.org/jira/browse/FREEMARKER/">Report a bug</a></li><li><a href="http://stackoverflow.com/questions/ask?tags=freemarker">Ask a question</a></li><li><a href="http://freemarker.org/mailing-lists.html">Mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/freemarker/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="http://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"> <p class="last-generated">
+Last generated:
+<time itemprop="dateModified" datetime="2017-03-13T10:55:28Z" title="Monday, March 13, 2017 10:55:28 AM GMT">2017-03-13 10:55:28 GMT</time>, for Freemarker 2.3.26 </p>
+<p class="copyright">
+� <span itemprop="copyrightYear">1999</span>\u20132017
+<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="http://apache.org/">The Apache Software Foundation</a>. Apache FreeMarker, FreeMarker, Apache Incubator, Apache, the Apache FreeMarker logo are trademarks of The Apache Software Foundation. </p>
+</div></div></div></body>
+</html>