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}