package com.matrix.codeGeneration.core; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import com.matrix.codeGeneration.model.CodeFile; import com.matrix.codeGeneration.model.CodeModel; import com.matrix.codeGeneration.model.OutDataSource; import freemarker.template.Template; /** * @author 姜友瑶 * @e-mail:<935090232@qq.com> * @date 2015-10-23 * @description 代码生成器 */ public class Generator { public static void buildCodeFiles(OutDataSource outDataSource) { // 构建模型文件 outDataSource.convertToTableModel(); // 根据模型生成代码模型文件 List codeFileModel = generatorFile(outDataSource); // 根据模型文件生成实体文件 createCodeFile(codeFileModel, outDataSource); } /** * 创建要生成的所有文件的模型 * * @param configuration * @return */ private static List generatorFile(OutDataSource outDataSource) { List codeFiles = new ArrayList(); Set modelSet = outDataSource.getCodeModels().keySet(); // 由模型来生成对应的codeFile,因为模型最知道自己需要的数据是什么,codeFile不关心数据 for (String modelName : modelSet) { CodeModel codeModel = outDataSource.getCodeModels().get(modelName); List thisModelFiles = codeModel.buildCodeFile(outDataSource); codeFiles.addAll(thisModelFiles); } return codeFiles; } /** * 创建 * * @param configuration * @param dbModel * @return */ private static void createCodeFile(List codeFiles, OutDataSource coutDataSource) { try { freemarker.template.Configuration cfg = new freemarker.template.Configuration(); cfg.setLocale(Locale.SIMPLIFIED_CHINESE); cfg.setDefaultEncoding("utf-8"); cfg.setEncoding(Locale.SIMPLIFIED_CHINESE, "utf-8"); cfg.setEncoding(Locale.SIMPLIFIED_CHINESE, "utf-8"); for (CodeFile codeFile : codeFiles) { Map root = new HashMap(); // 设置文件需要的数据 root.putAll(codeFile.getData()); // 生成代码文件 System.out.println("生成" + codeFile.getFileName() + "文件..."); cfg.setDirectoryForTemplateLoading(new File(coutDataSource.getUserTempLataHome())); // 获取模板(template) Template template = cfg.getTemplate(codeFile.getTemplateName(), "utf-8"); // 把文件写入磁盘 String filePath = coutDataSource.getTargetPath() + codeFile.getSavePath(); File file = new File(filePath); if (file.getParentFile().exists() && file.exists()) { File javaBean = new File(filePath + codeFile.getFileName()); javaBean.createNewFile(); BufferedWriter bf = new BufferedWriter(new FileWriter(javaBean)); template.process(root, bf); bf.flush(); bf.close(); } else { if (file.mkdirs()) { File javaBean = new File(filePath + codeFile.getFileName()); javaBean.createNewFile(); BufferedWriter bf = new BufferedWriter(new FileWriter(javaBean)); template.process(root, bf); bf.flush(); bf.close(); } else { System.out.println("创建文件失败" + filePath); } } } } catch (Exception e) { e.printStackTrace(); } } }