Add engineSupplier property to ScriptTemplateConfigurer
This commit adds an engineSupplier property to ScriptTemplateConfigurer
and ScriptTemplateView in order to be able to customize the ScriptEngine
when sharedEngine is set to false.
This can be useful with Graal.js for example.
Closes gh-23258
@ -52,6 +53,9 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@@ -52,6 +53,9 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@Nullable
privateScriptEngineengine;
@Nullable
privateSupplier<ScriptEngine>engineSupplier;
@Nullable
privateStringengineName;
@ -94,8 +98,10 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@@ -94,8 +98,10 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@ -107,11 +113,31 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@@ -107,11 +113,31 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@ -74,6 +75,9 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -74,6 +75,9 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@Nullable
privateScriptEngineengine;
@Nullable
privateSupplier<ScriptEngine>engineSupplier;
@Nullable
privateStringengineName;
@ -118,6 +122,13 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -118,6 +122,13 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@ -175,7 +186,10 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -175,7 +186,10 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@ -200,22 +214,33 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -200,22 +214,33 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
"No script engine found, please specify either 'engine' or 'engineName'.");
intengineCount=0;
if(this.engine!=null){
engineCount++;
}
if(this.engineSupplier!=null){
engineCount++;
}
if(this.engineName!=null){
engineCount++;
}
Assert.isTrue(engineCount==1,
"You should define either 'engine', 'engineSupplier' or 'engineName'.");
if(Boolean.FALSE.equals(this.sharedEngine)){
Assert.isTrue(this.engineName!=null,
Assert.isTrue(this.engine==null,
"When 'sharedEngine' is set to false, you should specify the "+
"script engine using the 'engineName' property, not the 'engine' one.");
"script engine using 'engineName' or 'engineSupplier' , not 'engine'.");
}
elseif(this.engine!=null){
loadScripts(this.engine);
}
else{
elseif(this.engineName!=null){
setEngine(createEngineFromName(this.engineName));
}
else{
setEngine(createEngineFromSupplier());
}
if(this.renderFunction!=null&&this.engine!=null){
Assert.isInstanceOf(Invocable.class,this.engine,
@ -225,8 +250,12 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -225,8 +250,12 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
protectedScriptEnginegetEngine(){
if(Boolean.FALSE.equals(this.sharedEngine)){
Assert.state(this.engineName!=null,"No engine name specified");
@ -246,6 +275,16 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -246,6 +275,16 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
returnengine;
}
privateScriptEnginecreateEngineFromSupplier(){
ScriptEngineengine=this.engineSupplier.get();
if(this.renderFunction!=null&&engine!=null){
Assert.isInstanceOf(Invocable.class,engine,
"ScriptEngine must implement Invocable when 'renderFunction' is specified");
@ -52,6 +53,9 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@@ -52,6 +53,9 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@Nullable
privateScriptEngineengine;
@Nullable
privateSupplier<ScriptEngine>engineSupplier;
@Nullable
privateStringengineName;
@ -96,9 +100,11 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@@ -96,9 +100,11 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@ -110,11 +116,31 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@@ -110,11 +116,31 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@ -131,12 +157,10 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@@ -131,12 +157,10 @@ public class ScriptTemplateConfigurer implements ScriptTemplateConfig {
@ -88,6 +89,9 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -88,6 +89,9 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@Nullable
privateScriptEngineengine;
@Nullable
privateSupplier<ScriptEngine>engineSupplier;
@Nullable
privateStringengineName;
@ -138,6 +142,13 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -138,6 +142,13 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@ -203,7 +214,10 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -203,7 +214,10 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@ -231,22 +245,33 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -231,22 +245,33 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
"No script engine found, please specify either 'engine' or 'engineName'.");
intengineCount=0;
if(this.engine!=null){
engineCount++;
}
if(this.engineSupplier!=null){
engineCount++;
}
if(this.engineName!=null){
engineCount++;
}
Assert.isTrue(engineCount==1,
"You should define either 'engine', 'engineSupplier' or 'engineName'.");
if(Boolean.FALSE.equals(this.sharedEngine)){
Assert.isTrue(this.engineName!=null,
Assert.isTrue(this.engine==null,
"When 'sharedEngine' is set to false, you should specify the "+
"script engine using the 'engineName' property, not the 'engine' one.");
"script engine using 'engineName' or 'engineSupplier' , not 'engine'.");
}
elseif(this.engine!=null){
loadScripts(this.engine);
}
else{
elseif(this.engineName!=null){
setEngine(createEngineFromName(this.engineName));
}
else{
setEngine(createEngineFromSupplier());
}
if(this.renderFunction!=null&&this.engine!=null){
Assert.isInstanceOf(Invocable.class,this.engine,
@ -261,12 +286,17 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -261,12 +286,17 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
engines=newHashMap<>(4);
enginesHolder.set(engines);
}
Assert.state(this.engineName!=null,"No engine name specified");
@ -278,14 +308,21 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
@@ -278,14 +308,21 @@ public class ScriptTemplateView extends AbstractUrlBasedView {