package foundation.io.template;
|
|
import java.io.File;
|
import java.util.List;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
import foundation.dao.DataPackage;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.io.FileCenter;
|
import foundation.io.FileRepository;
|
import foundation.util.ContentBuilder;
|
import foundation.util.MapList;
|
import foundation.variant.expression.VariantExpression;
|
import foundation.variant.expression.VariantSegment;
|
|
public class Template {
|
|
public static String ListFlag_Start = "[@{list.";
|
public static String ListFlag_End = "}]";
|
|
private String code;
|
private String template;
|
private String filePath;
|
private TemplateType type;
|
private VariantExpression formExpression;
|
private MapList<String, VariantExpression> listExpression;
|
|
public Template(String content) throws Exception {
|
this.template = content;
|
parseTemplate(template);
|
}
|
|
public Template(Entity entity) throws Exception {
|
this.filePath = entity.getString("file_path");
|
this.code = entity.getString("code");
|
|
File templateFile = new File(FileRepository.getTemplatePath(null) + filePath);
|
this.template = FileCenter.readFile(templateFile);
|
parseTemplate(template);
|
}
|
|
private void parseTemplate(String template) throws Exception {
|
//1. 解析列表 *[{ }]
|
String pattern = "\\*\\[([^\\]]+)\\]";
|
|
Pattern r = Pattern.compile(pattern);
|
Matcher m = r.matcher(template);
|
|
listExpression = new MapList<String, VariantExpression>();
|
|
while (m.find()) {
|
String segment = m.group();
|
int pos = segment.indexOf(".");
|
|
if (pos < 0) {
|
continue;
|
}
|
|
String listName = segment.substring(2, pos);
|
VariantExpression formExpression = new VariantExpression(segment.substring(pos + 1, segment.length()-1));
|
listExpression.add(listName, formExpression);
|
|
//1.2 使用[@{list.dataName}]替换列表作为参数
|
template = template.replace(segment, ListFlag_Start + listName + ListFlag_End);
|
}
|
|
//2. 解析非列表
|
formExpression = new VariantExpression(template);
|
}
|
|
public String fillVariants(List<DataPackage> dataPackages) throws Exception {
|
if (TemplateType.DataPackage == type && dataPackages != null && dataPackages.size() > 0 ) {
|
DataPackage dataPackage = dataPackages.get(0);
|
|
return fillVariants(dataPackage);
|
}
|
|
ContentBuilder builder = new ContentBuilder(",");
|
String oneData;
|
|
for (DataPackage dataPackage : dataPackages) {
|
oneData = fillVariants(dataPackage);
|
|
builder.append(oneData);
|
}
|
|
return "[" + builder.toString() + "]";
|
}
|
|
public String fillVariants(DataPackage dataPackage) throws Exception {
|
Entity master = dataPackage.getMasterEntity();
|
|
for (VariantSegment segment : formExpression) {
|
String name = segment.getName();
|
String dataName, fieldName = name, value;
|
|
int pos = name.indexOf("list.");
|
|
// 1. 当参数不是列表
|
if (pos < 0) {
|
pos = name.indexOf(".");
|
|
if (pos < 0) {
|
segment.setValue(master.getString(fieldName));
|
|
continue;
|
}
|
|
dataName = name.substring(0, pos);
|
fieldName = name.substring(pos + 2);
|
|
Entity entity = dataPackage.getItemEntity(dataName);
|
value = entity.getString(fieldName);
|
segment.setValue(value);
|
|
continue;
|
}
|
|
// 2. 当参数是列表
|
dataName = name.substring(pos + 5);
|
dataPackage.loadOneDataFromDB();
|
VariantExpression oneListVariants = listExpression.get(dataName);
|
EntitySet entitySet = dataPackage.getItemEntitySet(dataName);
|
|
ContentBuilder contentBuilder = new ContentBuilder(",");
|
|
if (entitySet != null) {
|
for (Entity entity : entitySet) {
|
oneListVariants = fillLine(oneListVariants, entity, master);
|
|
contentBuilder.append(oneListVariants.toString());
|
}
|
|
}
|
|
segment.setValue(contentBuilder.toString());
|
}
|
|
return formExpression.toString();
|
}
|
|
public static String fillStringVariants(String url, DataPackage dataPackage) throws Exception {
|
Template template = new Template(url);
|
template.parseTemplate(url);
|
|
return template.fillVariants(dataPackage);
|
}
|
|
private VariantExpression fillLine(VariantExpression oneListVariants, Entity entity, Entity master) {
|
String fieldName, value;
|
|
for (VariantSegment segment : oneListVariants) {
|
String name = segment.getName();
|
fieldName = name;
|
int pos = name.indexOf(".");
|
|
if (pos < 0) {
|
segment.setValue(master.getString(fieldName));
|
continue;
|
}
|
|
fieldName = name.substring(pos + 1);
|
value = entity.getString(fieldName);
|
segment.setValue(value);
|
}
|
|
return oneListVariants;
|
}
|
|
public String getCode() {
|
return code;
|
}
|
}
|