001/**
002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package io.jboot.codegen.service;
017
018import com.jfinal.core.JFinal;
019import com.jfinal.kit.Kv;
020import com.jfinal.kit.StrKit;
021import com.jfinal.plugin.activerecord.generator.BaseModelGenerator;
022import com.jfinal.plugin.activerecord.generator.MetaBuilder;
023import com.jfinal.plugin.activerecord.generator.TableMeta;
024import com.jfinal.template.Engine;
025import com.jfinal.template.source.ClassPathSourceFactory;
026import io.jboot.codegen.CodeGenHelpler;
027
028import java.io.File;
029import java.io.FileOutputStream;
030import java.io.IOException;
031import java.io.OutputStreamWriter;
032import java.util.List;
033
034public class JbootServiceInterfaceGenerator extends BaseModelGenerator {
035
036    private String modelPacket;
037    private String basePackage;
038    private String classSuffix = "Service";
039    private String classPrefix = "";
040
041    private MetaBuilder metaBuilder;
042
043
044    public JbootServiceInterfaceGenerator(String basePackage, String modelPacket) {
045        super(basePackage, CodeGenHelpler.getUserDir() + "/src/main/java/" + basePackage.replace(".", "/"));
046
047
048        this.modelPacket = modelPacket;
049        this.basePackage = basePackage;
050        this.template = "io/jboot/codegen/service/service_template.tp";
051        this.metaBuilder = CodeGenHelpler.createMetaBuilder();
052    }
053
054    public JbootServiceInterfaceGenerator(String basePackage, String outputDir, String modelPacket) {
055        super(basePackage, outputDir);
056        this.modelPacket = modelPacket;
057        this.basePackage = basePackage;
058        this.template = "io/jboot/codegen/service/service_template.tp";
059        this.metaBuilder = CodeGenHelpler.createMetaBuilder();
060    }
061
062    public String getClassSuffix() {
063        return classSuffix;
064    }
065
066    public JbootServiceInterfaceGenerator setClassSuffix(String classSuffix) {
067        this.classSuffix = classSuffix;
068        return this;
069    }
070
071    public String getClassPrefix() {
072        return classPrefix;
073    }
074
075    public JbootServiceInterfaceGenerator setClassPrefix(String classPrefix) {
076        this.classPrefix = classPrefix;
077        return this;
078    }
079
080    public void generate() {
081        generate(metaBuilder.build());
082    }
083
084    /**
085     * 设置需要被移除的表名前缀
086     * 例如表名  "tb_account",移除前缀 "tb_" 后变为 "account"
087     */
088    public JbootServiceInterfaceGenerator setRemovedTableNamePrefixes(String... prefixes) {
089        metaBuilder.setRemovedTableNamePrefixes(prefixes);
090        return this;
091    }
092
093    public JbootServiceInterfaceGenerator addExcludedTable(String... excludedTables) {
094        metaBuilder.addExcludedTable(excludedTables);
095        return this;
096    }
097
098    @Override
099    public void generate(List<TableMeta> tableMetas) {
100        System.out.println("Generate base model ...");
101        System.out.println("Base Model Output Dir: " + baseModelOutputDir);
102
103        Engine engine = Engine.create("forService");
104        engine.setSourceFactory(new ClassPathSourceFactory());
105        engine.addSharedMethod(new StrKit());
106        engine.addSharedObject("getterTypeMap", getterTypeMap);
107        engine.addSharedObject("javaKeyword", javaKeyword);
108
109        for (TableMeta tableMeta : tableMetas) {
110            genBaseModelContent(tableMeta);
111        }
112        writeToFile(tableMetas);
113    }
114
115    @Override
116    protected void genBaseModelContent(TableMeta tableMeta) {
117        Kv data = Kv.by("baseModelPackageName", baseModelPackageName);
118        data.set("generateChainSetter", generateChainSetter);
119        data.set("tableMeta", tableMeta);
120        data.set("modelPacket", modelPacket);
121        data.set("basePackage", basePackage);
122        data.set("classSuffix", this.classSuffix);
123        data.set("classPrefix", this.classPrefix);
124
125        Engine engine = Engine.use("forService");
126        tableMeta.baseModelContent = engine.getTemplate(template).renderToString(data);
127    }
128
129
130    /**
131     * base model 覆盖写入
132     */
133    @Override
134    protected void writeToFile(TableMeta tableMeta) throws IOException {
135        File dir = new File(baseModelOutputDir);
136        if (!dir.exists()) {
137            dir.mkdirs();
138        }
139
140        String target = baseModelOutputDir + File.separator + getClassPrefix() + tableMeta.modelName + classSuffix + ".java";
141
142        File targetFile = new File(target);
143        if (targetFile.exists()) {
144            return;
145        }
146
147        try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(target), JFinal.me().getConstants().getEncoding())) {
148            osw.write(tableMeta.baseModelContent);
149        }
150    }
151    public JbootServiceInterfaceGenerator addWhitelist(String... tableNames) {
152        if (tableNames != null) {
153            this.metaBuilder.addWhitelist(tableNames);
154        }
155        return this;
156    }
157
158}