/** * Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jfinal.plugin.activerecord.generator; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.List; import com.jfinal.kit.StrKit; /** * Model 生成器 */ public class ModelGenerator { protected String packageTemplate = "package %s;%n%n"; protected String importTemplate = "import %s.%s;%n%n"; protected String classDefineTemplate = "/**%n" + " * Generated by JFinal.%n" + " */%n" + "@SuppressWarnings(\"serial\")%n" + "public class %s extends %s<%s> {%n"; protected String daoTemplate = "\tpublic static final %s dao = new %s().dao();%n"; protected String modelPackageName; protected String baseModelPackageName; protected String modelOutputDir; protected boolean generateDaoInModel = false; public ModelGenerator(String modelPackageName, String baseModelPackageName, String modelOutputDir) { if (StrKit.isBlank(modelPackageName)) { throw new IllegalArgumentException("modelPackageName can not be blank."); } if (modelPackageName.contains("/") || modelPackageName.contains("\\")) { throw new IllegalArgumentException("modelPackageName error : " + modelPackageName); } if (StrKit.isBlank(baseModelPackageName)) { throw new IllegalArgumentException("baseModelPackageName can not be blank."); } if (baseModelPackageName.contains("/") || baseModelPackageName.contains("\\")) { throw new IllegalArgumentException("baseModelPackageName error : " + baseModelPackageName); } if (StrKit.isBlank(modelOutputDir)) { throw new IllegalArgumentException("modelOutputDir can not be blank."); } this.modelPackageName = modelPackageName; this.baseModelPackageName = baseModelPackageName; this.modelOutputDir = modelOutputDir; } public void setGenerateDaoInModel(boolean generateDaoInModel) { this.generateDaoInModel = generateDaoInModel; } public void generate(List<TableMeta> tableMetas) { System.out.println("Generate model ..."); System.out.println("Model Output Dir: " + modelOutputDir); for (TableMeta tableMeta : tableMetas) { genModelContent(tableMeta); } writeToFile(tableMetas); } protected void genModelContent(TableMeta tableMeta) { StringBuilder ret = new StringBuilder(); genPackage(ret); genImport(tableMeta, ret); genClassDefine(tableMeta, ret); genDao(tableMeta, ret); ret.append(String.format("}%n")); tableMeta.modelContent = ret.toString(); } protected void genPackage(StringBuilder ret) { ret.append(String.format(packageTemplate, modelPackageName)); } protected void genImport(TableMeta tableMeta, StringBuilder ret) { ret.append(String.format(importTemplate, baseModelPackageName, tableMeta.baseModelName)); } protected void genClassDefine(TableMeta tableMeta, StringBuilder ret) { ret.append(String.format(classDefineTemplate, tableMeta.modelName, tableMeta.baseModelName, tableMeta.modelName)); } protected void genDao(TableMeta tableMeta, StringBuilder ret) { if (generateDaoInModel) { ret.append(String.format(daoTemplate, tableMeta.modelName, tableMeta.modelName)); } else { ret.append(String.format("\t%n")); } } protected void writeToFile(List<TableMeta> tableMetas) { try { for (TableMeta tableMeta : tableMetas) { writeToFile(tableMeta); } } catch (IOException e) { throw new RuntimeException(e); } } /** * 若 model 文件存在,则不生成,以免覆盖用户手写的代码 */ protected void writeToFile(TableMeta tableMeta) throws IOException { File dir = new File(modelOutputDir); if (!dir.exists()) { dir.mkdirs(); } String target = modelOutputDir + File.separator + tableMeta.modelName + ".java"; File file = new File(target); if (file.exists()) { return ; // 若 Model 存在,不覆盖 } FileWriter fw = new FileWriter(file); try { fw.write(tableMeta.modelContent); } finally { fw.close(); } } }