<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<font size="4"><font face="monospace">Nice.<br>
<br>
So that means java.lang additions are limited to StringTemplate
(with nested Processor), and public jl.runtime limited to
Template{Runtime,Support}. <br>
<br>
In the spirit of "nothing left to take away", who are the
methods in TemplateSupport used by? Authors of processors?
There's not too much here -- creation, interpolation,
combination. Would these make sense as static helper methods on
STringTemplate? They'd be more discoverable there. <br>
<br>
</font></font><br>
<div class="moz-cite-prefix">On 3/27/2023 9:07 AM, Jim Laskey wrote:<br>
</div>
<blockquote type="cite" cite="mid:15178054-61DC-49CB-B14D-174F5A88ECD2@oracle.com">
<p style="font-size: 14px;">After the string template interface
name changes, i.e., <code style="color: rgb(0, 0, 170);">TemplateProcessor</code> becoming <code style="color: rgb(0, 0, 170);">Processor</code>, the rationale
for the existence of <code style="color: rgb(0, 0, 170);">SimpleProcessor </code>and <code style="color: rgb(0, 0, 170);">StringProcessor</code> has
lessened to the point where they should be dropped.</p>
<p style="font-size: 14px;"><code style="color: rgb(0, 0, 170);">SimpleProcessor</code> owed
its existence to the long-winded name <code style="color: rgb(0,
0, 170);">TemplateProcessor</code> and that ugly second
parameter, <code style="color: rgb(0, 0, 170);">E</code>, in <code style="color: rgb(0, 0, 170);">Processor<R, E></code> (in
a many of cases <code style="color: rgb(0, 0, 170);">E</code> will
be the unchecked <code style="color: rgb(0, 0, 170);">RuntimeException</code>). <code style="color: rgb(0, 0, 170);">StringProcessor</code> existed
because most template processors will produce strings.</p>
<pre style="background-color: rgb(239, 239, 239); border: 1px solid black; padding: 8px; font-size: 14px;"><code style="color: rgb(0, 0, 170);">TemplateProcessor<JSONObject, RuntimeException> JSON = st-> new JSONObject(st.interpolate());
TemplateProcessor<String, RuntimeException> INTER = StringTemplate::interpolate;</code></pre>
<p style="font-size: 14px;">vs.</p>
<pre style="background-color: rgb(239, 239, 239); border: 1px solid black; padding: 8px; font-size: 14px;"><code style="color: rgb(0, 0, 170);">SimpleProcessor<JSONObject> JSON = st-> new JSONObject(st.interpolate());
StringProcessor INTER = StringTemplate::interpolate;</code></pre>
<p style="font-size: 14px;">It was thought that having the
friendlier interfaces would provide clarity, hide <code style="color: rgb(0, 0, 170);">RuntimeException</code> and
simplify explanation. The reality is that most developers will
define template processors using full class declarations.
Furthermore, developers will learn to use <code style="color:
rgb(0, 0, 170);">RuntimeException</code> regularly due to the
abundance of template processor examples.</p>
<pre style="background-color: rgb(239, 239, 239); border: 1px solid black; padding: 8px; font-size: 14px;"><code style="color: rgb(0, 0, 170);">public class InterpolateProcessor implements Processor<String, RuntimeException> {
@Override
public String process(StringTemplate st) {
return st.interpolate();
}
}
SimpleProcessor<String> INTER = new InterpolateProcessor();
</code></pre>
<p style="font-size: 14px;">Even after <code style="color: rgb(0,
0, 170);">SimpleProcessor</code> and <code style="color:
rgb(0, 0, 170);">StringProcessor</code> go away, developers
can still use the functional interface shorthand.</p>
<pre style="background-color: rgb(239, 239, 239); border: 1px solid black; padding: 8px; font-size: 14px;"><code style="color: rgb(0, 0, 170);">Processor<JSONObject, RuntimeException> JSON = st-> new JSONObject(st.interpolate());
Processor<String, RuntimeException> INTER = StringTemplate::interpolate;</code></pre>
<p style="font-size: 14px;">And, a new factory method, <code style="color: rgb(0, 0, 170);">Processor.of</code>, will be
added for fans of <code style="color: rgb(0, 0, 170);">var</code>.</p>
<pre style="background-color: rgb(239, 239, 239); border: 1px solid black; padding: 8px; font-size: 14px;"><code style="color: rgb(0, 0, 170);">var JSON = Processor.of(st-> new JSONObject(st.interpolate()));
var INTER = Processor.of(StringTemplate::interpolate);</code></pre>
<p style="font-size: 14px;">For those developers that like the
notion of <code style="color: rgb(0, 0, 170);">SimpleProcessor</code> and <code style="color: rgb(0, 0, 170);">StringProcessor</code>, these
interfaces can be trivially defined per project;</p>
<pre style="background-color: rgb(239, 239, 239); border: 1px solid black; padding: 8px; font-size: 14px;"><code style="color: rgb(0, 0, 170);">@FunctionalInterface
public interface SimpleProcessor<R> extends Processor<R, RuntimeException> {}
@FunctionalInterface
public interface StringProcessor extends SimpleProcessor<String> {}</code></pre>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
<blockquote type="cite">
<div>On Mar 17, 2023, at 10:24 AM, Jim Laskey
<a class="moz-txt-link-rfc2396E" href="mailto:james.laskey@oracle.com"><james.laskey@oracle.com></a> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<div style="overflow-wrap: break-word; -webkit-nbsp-mode:
space; line-break: after-white-space;">
<div style="font-size: 14px;">This is a heads up about
some name changes coming to the string template feature
with the intent of eliminating the “java.lang.template”
package along with clarifying the processor hierarchy,</div>
<div><br>
</div>
<div>
<table style="border-collapse: collapse; width: 481pt;" width="641" cellspacing="0" cellpadding="0" border="0">
<colgroup><col style="width: 265pt;" width="353"><col style="width: 216pt;" width="288"></colgroup>
<tbody>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt; width:
265pt;" width="353" height="21">
<u><font face="Consolas">Old</font></u></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; width: 216pt;" width="288">
<u><font face="Consolas">New</font></u></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.Carriers*</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.runtime.Carriers*</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.ReferencedKeyMap*</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.runtime.ReferencedKeyMap*</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.ReferenceKey*</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.runtime.ReferenceKey*</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.StringTemplateImpl*</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.runtime.StringTemplateImpl*</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.StringTemplateImplFactory*
</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.runtime.StringTemplateImplFactory*</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.runtime.TemplateRuntime</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.runtime.TemplateRuntime</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.TemplateSupport*</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.runtime.TemplateSupport</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.StringTemplate</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.StringTemplate</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.ValidatingProcessor</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.StringTemplate.Processor</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.ProcessorLinkage</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.StringTemplate.Processor.Linkage</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.TemplateProcessor</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.StringTemplate.SimpleProcessor</font></td>
</tr>
<tr style="height: 16pt;" height="21">
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap; height: 16pt;" height="21">
<font face="Consolas">java.lang.template.StringProcessor</font></td>
<td style="padding-top: 1px; padding-right: 1px;
padding-left: 1px; font-size: 12pt;
vertical-align: bottom; border: none;
white-space: nowrap;">
<font face="Consolas">java.lang.StringTemplate.StringProcessor</font></td>
</tr>
</tbody>
</table>
</div>
<div><font face="Consolas"><br>
</font></div>
<div><font face="Consolas">(*) - package private</font></div>
<div><br>
</div>
<div style="font-size: 14px;"><br>
</div>
<div style="font-size: 14px;">The new processor hierarchy
will be;</div>
<div style="font-size: 14px;"><br>
</div>
<div><font face="Consolas"><span style="font-style:
normal; font-size: 14px;">interface Processor<R,
E></span></font></div>
<div><font face="Consolas"><span style="font-style:
normal; font-size: 14px;">interface
SimpleProcessor<R> extends Processor<R,
RuntimeException></span></font></div>
<div><font face="Consolas"><span style="font-style:
normal; font-size: 14px;">interface StringProcessor
extends SimpleProcessor<String></span></font></div>
<div style="font-size: 14px;"><br>
</div>
<div style="font-size: 14px;">It will take me a few days
to update the JEP, CSRs, PR and JLS, so stay tuned. As
always, comments are welcome.</div>
<div style="font-size: 14px;"><br>
</div>
<div style="font-size: 14px;">Cheers,</div>
<div style="font-size: 14px;"><br>
</div>
<div style="font-size: 14px;">— Jim</div>
<div style="font-size: 14px;"><br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</blockquote>
<br>
</body>
</html>