2021SC@SDUSC
cache.TemplateConfigurationFactory及其子类
TemplateConfigurationFactory及其子类
总览图:
1.TemplateConfigurationFactory抽象类
public abstract class TemplateConfigurationFactory {
private Configuration cfg;
public abstract TemplateConfiguration get(String sourceName, Object templateSource)
throws IOException, TemplateConfigurationFactoryException;
public final void setConfiguration(Configuration cfg) {
if (this.cfg != null) {
if (cfg != this.cfg) {
throw new IllegalStateException(
"The TemplateConfigurationFactory is already bound to another Configuration");
}
return;
} else {
this.cfg = cfg;
setConfigurationOfChildren(cfg);
}
}
public Configuration getConfiguration() {
return cfg;
}
protected abstract void setConfigurationOfChildren(Configuration cfg);
}
作用:为模板源创建(或返回)TemplateConfiguration对象。
2.ConditionalTemplateConfigurationFactory类
代码:
public class ConditionalTemplateConfigurationFactory extends TemplateConfigurationFactory {
private final TemplateSourceMatcher matcher;
private final TemplateConfiguration templateConfiguration;
private final TemplateConfigurationFactory templateConfigurationFactory;
public ConditionalTemplateConfigurationFactory(
TemplateSourceMatcher matcher, TemplateConfigurationFactory templateConfigurationFactory) {
this.matcher = matcher;
this.templateConfiguration = null;
this.templateConfigurationFactory = templateConfigurationFactory;
}
public ConditionalTemplateConfigurationFactory(
TemplateSourceMatcher matcher, TemplateConfiguration templateConfiguration) {
this.matcher = matcher;
this.templateConfiguration = templateConfiguration;
this.templateConfigurationFactory = null;
}
@Override
public TemplateConfiguration get(String sourceName, Object templateSource)
throws IOException, TemplateConfigurationFactoryException {
if (matcher.matches(sourceName, templateSource)) {
if (templateConfigurationFactory != null) {
return templateConfigurationFactory.get(sourceName, templateSource);
} else {
return templateConfiguration;
}
} else {
return null;
}
}
@Override
protected void setConfigurationOfChildren(Configuration cfg) {
if (templateConfiguration != null) {
templateConfiguration.setParentConfiguration(cfg);
}
if (templateConfigurationFactory != null) {
templateConfigurationFactory.setConfiguration(cfg);
}
}
}
作用:当指定的匹配器与模板源匹配时,直接返回给定的TemplateConfiguration对象或另一个TemplateConfigationFactory的结果。
3.FirstMatchTemplateConfigurationFactory
代码:
public class FirstMatchTemplateConfigurationFactory extends TemplateConfigurationFactory {
private final TemplateConfigurationFactory[] templateConfigurationFactories;
private boolean allowNoMatch;
private String noMatchErrorDetails;
public FirstMatchTemplateConfigurationFactory(TemplateConfigurationFactory... templateConfigurationFactories) {
this.templateConfigurationFactories = templateConfigurationFactories;
}
@Override
public TemplateConfiguration get(String sourceName, Object templateSource)
throws IOException, TemplateConfigurationFactoryException {
for (TemplateConfigurationFactory tcf : templateConfigurationFactories) {
TemplateConfiguration tc = tcf.get(sourceName, templateSource);
if (tc != null) {
return tc;
}
}
if (!allowNoMatch) {
throw new TemplateConfigurationFactoryException(
FirstMatchTemplateConfigurationFactory.class.getSimpleName()
+ " has found no matching choice for source name "
+ StringUtil.jQuote(sourceName) + ". "
+ (noMatchErrorDetails != null
? "Error details: " + noMatchErrorDetails
: "(Set the noMatchErrorDetails property of the factory bean to give a more specific error "
+ "message. Set allowNoMatch to true if this shouldn't be an error.)"));
}
return null;
}
public boolean getAllowNoMatch() {
return allowNoMatch;
}
public void setAllowNoMatch(boolean allowNoMatch) {
this.allowNoMatch = allowNoMatch;
}
public String getNoMatchErrorDetails() {
return noMatchErrorDetails;
}
public void setNoMatchErrorDetails(String noMatchErrorDetails) {
this.noMatchErrorDetails = noMatchErrorDetails;
}
public FirstMatchTemplateConfigurationFactory allowNoMatch(boolean allow) {
setAllowNoMatch(allow);
return this;
}
public FirstMatchTemplateConfigurationFactory noMatchErrorDetails(String message) {
setNoMatchErrorDetails(message);
return this;
}
@Override
protected void setConfigurationOfChildren(Configuration cfg) {
for (TemplateConfigurationFactory templateConfigurationFactory : templateConfigurationFactories) {
templateConfigurationFactory.setConfiguration(cfg);
}
}
}
作用:返回子工厂中第一个非空的结果,忽略之后的子工厂。按照子工厂被添加的顺序调用。
4.MergingTemplateConfigurationFactory
代码:
public class MergingTemplateConfigurationFactory extends TemplateConfigurationFactory {
private final TemplateConfigurationFactory[] templateConfigurationFactories;
public MergingTemplateConfigurationFactory(TemplateConfigurationFactory... templateConfigurationFactories) {
this.templateConfigurationFactories = templateConfigurationFactories;
}
@Override
public TemplateConfiguration get(String sourceName, Object templateSource)
throws IOException, TemplateConfigurationFactoryException {
TemplateConfiguration mergedTC = null;
TemplateConfiguration resultTC = null;
for (TemplateConfigurationFactory tcf : templateConfigurationFactories) {
TemplateConfiguration tc = tcf.get(sourceName, templateSource);
if (tc != null) {
if (resultTC == null) {
resultTC = tc;
} else {
if (mergedTC == null) {
Configuration cfg = getConfiguration();
if (cfg == null) {
throw new IllegalStateException(
"The TemplateConfigurationFactory wasn't associated to a Configuration yet.");
}
mergedTC = new TemplateConfiguration();
mergedTC.setParentConfiguration(cfg);
mergedTC.merge(resultTC);
resultTC = mergedTC;
}
mergedTC.merge(tc);
}
}
}
return resultTC;
}
@Override
protected void setConfigurationOfChildren(Configuration cfg) {
for (TemplateConfigurationFactory templateConfigurationFactory : templateConfigurationFactories) {
templateConfigurationFactory.setConfiguration(cfg);
}
}
}
作用:返回所有子工厂的合并结果。工厂按照添加的顺序合并。值为null的子工厂的结果将被忽略
5.TemplateConfigurationFactoryException类
代码:
public class TemplateConfigurationFactoryException extends Exception {
public TemplateConfigurationFactoryException(String message) {
super(message);
}
public TemplateConfigurationFactoryException(String message, Throwable cause) {
super(message, cause);
}
}
作用:并不是TemplateConfigurationFactory的子类,而是继承自Exception的一个异常类,定义了由TemplateConfigurationFactory抛出的IO Exception
注:Freemarker代码来自FreeMarker 中文官方参考手册
新手写的代码分析,文章若有错误还请指出