Helius
2021-02-26 de04085526eda992155716eda98af621ad681e4e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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<CodeFile> codeFileModel = generatorFile(outDataSource);
        // 根据模型文件生成实体文件
        createCodeFile(codeFileModel, outDataSource);
    }
 
    /**
     * 创建要生成的所有文件的模型
     * 
     * @param configuration
     * @return
     */
    private static List<CodeFile> generatorFile(OutDataSource outDataSource) {
        List<CodeFile> codeFiles = new ArrayList<CodeFile>();
        Set<String> modelSet = outDataSource.getCodeModels().keySet();
        // 由模型来生成对应的codeFile,因为模型最知道自己需要的数据是什么,codeFile不关心数据
        for (String modelName : modelSet) {
            CodeModel codeModel = outDataSource.getCodeModels().get(modelName);
            List<CodeFile> thisModelFiles = codeModel.buildCodeFile(outDataSource);
            codeFiles.addAll(thisModelFiles);
        }
        return codeFiles;
    }
 
    /**
     * 创建
     * 
     * @param configuration
     * @param dbModel
     * @return
     */
    private static void createCodeFile(List<CodeFile> 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<String, Object> root = new HashMap<String, Object>();
                // 设置文件需要的数据
                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();
        }
    }
 
}