ソースを参照

Merge branch 'master' into jfinal-java8

James 8 年 前
コミット
de4f730e22

+ 19 - 7
src/main/java/com/jfinal/template/Engine.java

@@ -22,8 +22,8 @@ import java.util.Map;
 import com.jfinal.kit.HashKit;
 import com.jfinal.kit.StrKit;
 import com.jfinal.template.expr.ast.MethodKit;
-import com.jfinal.template.source.FileSource;
 import com.jfinal.template.source.ISource;
+import com.jfinal.template.source.ISourceFactory;
 import com.jfinal.template.source.StringSource;
 import com.jfinal.template.stat.Parser;
 import com.jfinal.template.stat.ast.Stat;
@@ -51,6 +51,7 @@ public class Engine {
 	private String name;
 	private boolean devMode = false;
 	private EngineConfig config = new EngineConfig();
+	private ISourceFactory sourceFactory = config.getSourceFactory();
 	
 	private Map<String, Template> templateCache = new HashMap<String, Template>();
 	
@@ -134,23 +135,24 @@ public class Engine {
 		
 		Template template = templateCache.get(fileName);
 		if (template == null) {
-			template = buildTemplateByFileSource(fileName);
+			template = buildTemplateBySourceFactory(fileName);
 			templateCache.put(fileName, template);
 		} else if (devMode) {
 			if (template.isModified()) {
-				template = buildTemplateByFileSource(fileName);
+				template = buildTemplateBySourceFactory(fileName);
 				templateCache.put(fileName, template);
 			}
 		}
 		return template;
 	}
 	
-	private Template buildTemplateByFileSource(String fileName) {
-		FileSource fileSource = new FileSource(config.getBaseTemplatePath(), fileName, config.getEncoding());
+	private Template buildTemplateBySourceFactory(String fileName) {
+		// FileSource fileSource = new FileSource(config.getBaseTemplatePath(), fileName, config.getEncoding());
+		ISource source = sourceFactory.getSource(config.getBaseTemplatePath(), fileName, config.getEncoding());
 		Env env = new Env(config);
-		Parser parser = new Parser(env, fileSource.getContent(), fileName);
+		Parser parser = new Parser(env, source.getContent(), fileName);
 		if (devMode) {
-			env.addSource(fileSource);
+			env.addSource(source);
 		}
 		Stat stat = parser.parse();
 		Template template = new Template(env, stat);
@@ -386,6 +388,16 @@ public class Engine {
 		return devMode;
 	}
 	
+	public Engine setSourceFactory(ISourceFactory sourceFactory) {
+		this.config.setSourceFactory(sourceFactory);	// 放第一行先进行参数验证
+		this.sourceFactory = sourceFactory;
+		return this;
+	}
+	
+	public ISourceFactory getSourceFactory() {
+		return sourceFactory;
+	}
+	
 	public Engine setBaseTemplatePath(String baseTemplatePath) {
 		config.setBaseTemplatePath(baseTemplatePath);
 		return this;

+ 17 - 0
src/main/java/com/jfinal/template/EngineConfig.java

@@ -28,7 +28,9 @@ import com.jfinal.template.expr.ast.SharedMethodKit;
 import com.jfinal.template.ext.directive.*;
 import com.jfinal.template.ext.sharedmethod.Json;
 import com.jfinal.template.source.FileSource;
+import com.jfinal.template.source.FileSourceFactory;
 import com.jfinal.template.source.ISource;
+import com.jfinal.template.source.ISourceFactory;
 import com.jfinal.template.source.StringSource;
 import com.jfinal.template.stat.Location;
 import com.jfinal.template.stat.Parser;
@@ -49,6 +51,7 @@ public class EngineConfig {
 	Map<String, Object> sharedObjectMap = null;
 	
 	private IOutputDirectiveFactory outputDirectiveFactory = OutputDirectiveFactory.me;
+	private ISourceFactory sourceFactory = new FileSourceFactory();
 	private Map<String, Stat> directiveMap = new HashMap<String, Stat>();
 	private SharedMethodKit sharedMethodKit = new SharedMethodKit();
 	
@@ -223,6 +226,20 @@ public class EngineConfig {
 		return devMode;
 	}
 	
+	/**
+	 * Invoked by Engine only
+	 */
+	void setSourceFactory(ISourceFactory sourceFactory) {
+		if (sourceFactory == null) {
+			throw new IllegalArgumentException("sourceFactory can not be null");
+		}
+		this.sourceFactory = sourceFactory;
+	}
+	
+	public ISourceFactory getSourceFactory() {
+		return sourceFactory;
+	}
+	
 	public void setBaseTemplatePath(String baseTemplatePath) {
 		// 使用 ClassPathSourceFactory 时,允许 baseTemplatePath 为 null 值
 		if (baseTemplatePath == null) {

+ 2 - 2
src/main/java/com/jfinal/template/ext/directive/RenderDirective.java

@@ -25,7 +25,6 @@ import com.jfinal.template.Env;
 import com.jfinal.template.TemplateException;
 import com.jfinal.template.expr.ast.Assign;
 import com.jfinal.template.expr.ast.ExprList;
-import com.jfinal.template.source.FileSource;
 import com.jfinal.template.source.ISource;
 import com.jfinal.template.stat.Ctrl;
 import com.jfinal.template.stat.ParseException;
@@ -126,7 +125,8 @@ public class RenderDirective extends Directive {
 	
 	private StatInfo parseStatInfo(Env env, String subFileName) {
 		EngineConfig config = env.getEngineConfig();
-		FileSource fileSource = new FileSource(config.getBaseTemplatePath(), subFileName, config.getEncoding());
+		// FileSource fileSource = new FileSource(config.getBaseTemplatePath(), subFileName, config.getEncoding());
+		ISource fileSource = config.getSourceFactory().getSource(config.getBaseTemplatePath(), subFileName, config.getEncoding());
 		
 		try {
 			EnvSub envSub = new EnvSub(env);

+ 3 - 2
src/main/java/com/jfinal/template/stat/ast/Include.java

@@ -23,7 +23,7 @@ import com.jfinal.template.expr.ast.Assign;
 import com.jfinal.template.expr.ast.Const;
 import com.jfinal.template.expr.ast.Expr;
 import com.jfinal.template.expr.ast.ExprList;
-import com.jfinal.template.source.FileSource;
+import com.jfinal.template.source.ISource;
 import com.jfinal.template.stat.Ctrl;
 import com.jfinal.template.stat.Location;
 import com.jfinal.template.stat.ParseException;
@@ -87,7 +87,8 @@ public class Include extends Stat {
 	private void parseSubTemplate(Env env, String fileName, String parentFileName, Location location) {
 		String subFileName = getSubFileName(fileName, parentFileName);
 		EngineConfig config = env.getEngineConfig();
-		FileSource fileSource = new FileSource(config.getBaseTemplatePath(), subFileName, config.getEncoding());
+		// FileSource fileSource = new FileSource(config.getBaseTemplatePath(), subFileName, config.getEncoding());
+		ISource fileSource = config.getSourceFactory().getSource(config.getBaseTemplatePath(), subFileName, config.getEncoding());
 		try {
 			Parser parser = new Parser(env, fileSource.getContent(), subFileName);
 			if (config.isDevMode()) {