Enjoy 3.2 release ^_^

This commit is contained in:
James
2017-07-31 22:34:15 +08:00
parent 46a7c60813
commit b82af8e219
107 changed files with 12029 additions and 192 deletions

View File

@@ -0,0 +1,123 @@
/**
* Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.com).
*
* Licensed 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 com.jfinal.template;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jfinal.template.source.ISource;
import com.jfinal.template.stat.Location;
import com.jfinal.template.stat.ParseException;
import com.jfinal.template.stat.ast.Define;
/**
* Env
*
* 1解析时存放 #define 定义的模板函数
* 2运行时提供 #define 定义的模板函数
* 3每个 Template 对象持有一个 Env 对象
*/
public class Env {
protected EngineConfig engineConfig;
protected Map<String, Define> functionMap = new HashMap<String, Define>();
// 代替 Template 持有该属性,便于在 #include 指令中调用 Env.addSource()
protected List<ISource> sourceList = null;
public Env(EngineConfig engineConfig) {
this.engineConfig = engineConfig;
}
public EngineConfig getEngineConfig() {
return engineConfig;
}
/**
* Add template function
*/
public void addFunction(Define function) {
String fn = function.getFunctionName();
if (functionMap.containsKey(fn)) {
Define previous = functionMap.get(fn);
throw new ParseException(
"Template function \"" + fn + "\" already defined in " +
getAlreadyDefinedLocation(previous.getLocation()),
function.getLocation()
);
}
functionMap.put(fn, function);
}
private String getAlreadyDefinedLocation(Location loc) {
StringBuilder buf = new StringBuilder();
if (loc.getTemplateFile() != null) {
buf.append(loc.getTemplateFile()).append(", line ").append(loc.getRow());
} else {
buf.append("string template line ").append(loc.getRow());
}
return buf.toString();
}
/**
* Get function of current template first, getting shared function if null before
*/
public Define getFunction(String functionName) {
Define func = functionMap.get(functionName);
return func != null ? func : engineConfig.getSharedFunction(functionName);
}
/**
* For EngineConfig.addSharedFunction(...) only
*/
Map<String, Define> getFunctionMap() {
return functionMap;
}
/**
* 本方法用于在 devMode 之下,判断当前 Template 以及其下 #include 指令
* 所涉及的所有 ISource 对象是否被修改,以便于在 devMode 下重新加载
*
* sourceList 属性用于存放主模板以及 #include 进来的模板所对应的
* ISource 对象
*/
public boolean isSourceListModified() {
if (sourceList != null) {
for (int i = 0, size = sourceList.size(); i < size; i++) {
if (sourceList.get(i).isModified()) {
return true;
}
}
}
return false;
}
/**
* 添加本 Template 的 ISource以及该 Template 使用 include 包含进来的所有 ISource
* 以便于在 devMode 之下判断该 Template 是否被 modified进而 reload 该 Template
*/
public void addSource(ISource source) {
if (sourceList == null) {
sourceList = new ArrayList<ISource>();
}
sourceList.add(source);
}
}