blob: 84fda1fff1fcf246d10740d1df451e4a7518c34d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package freemarker.core;
import static org.junit.Assert.*;
import java.io.StringWriter;
import org.junit.Test;
import freemarker.cache.ConditionalTemplateConfigurationFactory;
import freemarker.cache.FileNameGlobMatcher;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.test.TemplateTest;
public class IncludeAndImportConfigurableLayersTest extends TemplateTest {
@Test
public void test3LayerImportNoClashes() throws Exception {
Configuration cfg = getConfiguration();
cfg.addAutoImport("t1", "t1.ftl");
TemplateConfiguration tc = new TemplateConfiguration();
tc.addAutoImport("t2", "t2.ftl");
cfg.setTemplateConfigurations(
new ConditionalTemplateConfigurationFactory(new FileNameGlobMatcher("main.ftl"), tc));
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoImport("t3", "t3.ftl");
env.process();
assertEquals("In main: t1;t2;t3;", sw.toString());
}
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.process();
assertEquals("In main: t1;t2;", sw.toString());
}
{
Template t = cfg.getTemplate("main2.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoImport("t3", "t3.ftl");
env.process();
assertEquals("In main2: t1;t3;", sw.toString());
}
cfg.removeAutoImport("t1");
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoImport("t3", "t3.ftl");
env.process();
assertEquals("In main: t2;t3;", sw.toString());
}
}
@Test
public void test3LayerImportClashes() throws Exception {
Configuration cfg = getConfiguration();
cfg.addAutoImport("t1", "t1.ftl");
cfg.addAutoImport("t2", "t2.ftl");
cfg.addAutoImport("t3", "t3.ftl");
TemplateConfiguration tc = new TemplateConfiguration();
tc.addAutoImport("t2", "t2b.ftl");
cfg.setTemplateConfigurations(
new ConditionalTemplateConfigurationFactory(new FileNameGlobMatcher("main.ftl"), tc));
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoImport("t3", "t3b.ftl");
env.process();
assertEquals("In main: t1;t2b;t3b;", sw.toString());
}
{
Template t = cfg.getTemplate("main2.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoImport("t3", "t3b.ftl");
env.process();
assertEquals("In main2: t1;t2;t3b;", sw.toString());
}
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.process();
assertEquals("In main: t1;t3;t2b;", sw.toString());
}
}
@Test
public void test3LayerIncludesNoClashes() throws Exception {
Configuration cfg = getConfiguration();
cfg.addAutoInclude("t1.ftl");
TemplateConfiguration tc = new TemplateConfiguration();
tc.addAutoInclude("t2.ftl");
cfg.setTemplateConfigurations(
new ConditionalTemplateConfigurationFactory(new FileNameGlobMatcher("main.ftl"), tc));
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoInclude("t3.ftl");
env.process();
assertEquals("T1;T2;T3;In main: t1;t2;t3;", sw.toString());
}
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.process();
assertEquals("T1;T2;In main: t1;t2;", sw.toString());
}
{
Template t = cfg.getTemplate("main2.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoInclude("t3.ftl");
env.process();
assertEquals("T1;T3;In main2: t1;t3;", sw.toString());
}
cfg.removeAutoInclude("t1.ftl");
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoInclude("t3.ftl");
env.process();
assertEquals("T2;T3;In main: t2;t3;", sw.toString());
}
}
@Test
public void test3LayerIncludeClashes() throws Exception {
Configuration cfg = getConfiguration();
cfg.addAutoInclude("t1.ftl");
cfg.addAutoInclude("t2.ftl");
cfg.addAutoInclude("t3.ftl");
TemplateConfiguration tc = new TemplateConfiguration();
tc.addAutoInclude("t2.ftl");
cfg.setTemplateConfigurations(
new ConditionalTemplateConfigurationFactory(new FileNameGlobMatcher("main.ftl"), tc));
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoInclude("t3.ftl");
env.process();
assertEquals("T1;T2;T3;In main: t1;t2;t3;", sw.toString());
}
{
Template t = cfg.getTemplate("main2.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoInclude("t3.ftl");
env.process();
assertEquals("T1;T2;T3;In main2: t1;t2;t3;", sw.toString());
}
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.process();
assertEquals("T1;T3;T2;In main: t1;t3;t2;", sw.toString());
}
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoInclude("t1.ftl");
env.process();
assertEquals("T3;T2;T1;In main: t3;t2;t1;", sw.toString());
}
}
@Test
public void test3LayerIncludesClashes2() throws Exception {
Configuration cfg = getConfiguration();
cfg.addAutoInclude("t1.ftl");
cfg.addAutoInclude("t1.ftl");
TemplateConfiguration tc = new TemplateConfiguration();
tc.addAutoInclude("t2.ftl");
tc.addAutoInclude("t2.ftl");
cfg.setTemplateConfigurations(
new ConditionalTemplateConfigurationFactory(new FileNameGlobMatcher("main.ftl"), tc));
{
Template t = cfg.getTemplate("main.ftl");
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
env.addAutoInclude("t3.ftl");
env.addAutoInclude("t3.ftl");
env.addAutoInclude("t1.ftl");
env.addAutoInclude("t1.ftl");
env.process();
assertEquals("T2;T3;T1;In main: t2;t3;t1;", sw.toString());
}
}
@Test
public void test3LayerLazyness() throws Exception {
for (Class<?> layer : new Class<?>[] { Configuration.class, Template.class, Environment.class }) {
test3LayerLazyness(layer, null, null, false, "t1;t2;");
test3LayerLazyness(layer, null, null, true, "t1;t2;");
test3LayerLazyness(layer, null, false, true, "t1;t2;");
test3LayerLazyness(layer, null, true, true, "t2;");
test3LayerLazyness(layer, false, null, false, "t1;t2;");
test3LayerLazyness(layer, false, null, true, "t1;t2;");
test3LayerLazyness(layer, false, false, true, "t1;t2;");
test3LayerLazyness(layer, false, true, true, "t2;");
test3LayerLazyness(layer, true, null, false, "");
test3LayerLazyness(layer, true, null, true, "");
test3LayerLazyness(layer, true, false, true, "t1;");
test3LayerLazyness(layer, true, true, true, "");
}
}
private void test3LayerLazyness(
Class<?> layer,
Boolean lazyImports,
Boolean lazyAutoImports, boolean setLazyAutoImports,
String expectedOutput)
throws Exception {
dropConfiguration();
Configuration cfg = getConfiguration();
cfg.addAutoImport("t1", "t1.ftl");
Template t = new Template(null, "<#import 't2.ftl' as t2>${loaded!}", cfg);
StringWriter sw = new StringWriter();
Environment env = t.createProcessingEnvironment(null, sw);
if (layer == Configuration.class) {
setLazynessOfConfigurable(cfg, lazyImports, lazyAutoImports, setLazyAutoImports);
} else if (layer == Template.class) {
setLazynessOfConfigurable(t, lazyImports, lazyAutoImports, setLazyAutoImports);
} else if (layer == Environment.class) {
setLazynessOfConfigurable(env, lazyImports, lazyAutoImports, setLazyAutoImports);
} else {
throw new IllegalArgumentException();
}
env.process();
assertEquals(expectedOutput, sw.toString());
}
private void setLazynessOfConfigurable(Configurable cfg, Boolean lazyImports, Boolean lazyAutoImports,
boolean setLazyAutoImports) {
if (lazyImports != null) {
cfg.setLazyImports(lazyImports);
}
if (setLazyAutoImports) {
cfg.setLazyAutoImports(lazyAutoImports);
}
}
@Override
protected Configuration createConfiguration() throws Exception {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_24);
cfg.setTemplateLoader(new StringTemplateLoader());
return cfg;
}
@Override
protected void addCommonTemplates() {
addTemplate("main.ftl", "In main: ${loaded}");
addTemplate("main2.ftl", "In main2: ${loaded}");
addTemplate("t1.ftl", "<#global loaded = (loaded!) + 't1;'>T1;");
addTemplate("t2.ftl", "<#global loaded = (loaded!) + 't2;'>T2;");
addTemplate("t3.ftl", "<#global loaded = (loaded!) + 't3;'>T3;");
addTemplate("t1b.ftl", "<#global loaded = (loaded!) + 't1b;'>T1b;");
addTemplate("t2b.ftl", "<#global loaded = (loaded!) + 't2b;'>T2b;");
addTemplate("t3b.ftl", "<#global loaded = (loaded!) + 't3b;'>T3b;");
}
}