| package com.xcong.excoin.generator.helper; | 
|   | 
| import com.xcong.excoin.common.annotation.Helper; | 
| import com.xcong.excoin.common.utils.AddressUtil; | 
| import com.xcong.excoin.common.utils.FebsUtil; | 
| import com.xcong.excoin.generator.entity.Column; | 
| import com.xcong.excoin.generator.entity.FieldType; | 
| import com.xcong.excoin.generator.entity.GeneratorConfig; | 
| import com.xcong.excoin.generator.entity.GeneratorConstant; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.google.common.io.Files; | 
| import freemarker.template.Configuration; | 
| import freemarker.template.Template; | 
| import freemarker.template.TemplateExceptionHandler; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.apache.commons.io.FileUtils; | 
| import org.apache.commons.lang3.StringUtils; | 
|   | 
| import java.io.*; | 
| import java.nio.charset.StandardCharsets; | 
| import java.util.List; | 
| import java.util.Objects; | 
|   | 
| /** | 
|  * @author MrBird | 
|  */ | 
| @Slf4j | 
| @Helper | 
| public class GeneratorHelper { | 
|   | 
|     public void generateEntityFile(List<Column> columns, GeneratorConfig configure) throws Exception { | 
|         String suffix = GeneratorConstant.JAVA_FILE_SUFFIX; | 
|         String path = getFilePath(configure, configure.getEntityPackage(), suffix, false); | 
|         String templateName = GeneratorConstant.ENTITY_TEMPLATE; | 
|         File entityFile = new File(path); | 
|         JSONObject data = toJsonObject(configure); | 
|         data.put("hasDate", false); | 
|         data.put("hasBigDecimal", false); | 
|         columns.forEach(c -> { | 
|             c.setField(FebsUtil.underscoreToCamel(StringUtils.lowerCase(c.getName()))); | 
|             if (StringUtils.containsAny(c.getType(), FieldType.DATE, FieldType.DATETIME, FieldType.TIMESTAMP)) { | 
|                 data.put("hasDate", true); | 
|             } | 
|             if (StringUtils.containsAny(c.getType(), FieldType.DECIMAL, FieldType.NUMERIC)) { | 
|                 data.put("hasBigDecimal", true); | 
|             } | 
|         }); | 
|         data.put("columns", columns); | 
|         this.generateFileByTemplate(templateName, entityFile, data); | 
|     } | 
|   | 
|     public void generateMapperFile(List<Column> columns, GeneratorConfig configure) throws Exception { | 
|         String suffix = GeneratorConstant.MAPPER_FILE_SUFFIX; | 
|         String path = getFilePath(configure, configure.getMapperPackage(), suffix, false); | 
|         String templateName = GeneratorConstant.MAPPER_TEMPLATE; | 
|         File mapperFile = new File(path); | 
|         generateFileByTemplate(templateName, mapperFile, toJsonObject(configure)); | 
|     } | 
|   | 
|     public void generateServiceFile(List<Column> columns, GeneratorConfig configure) throws Exception { | 
|         String suffix = GeneratorConstant.SERVICE_FILE_SUFFIX; | 
|         String path = getFilePath(configure, configure.getServicePackage(), suffix, true); | 
|         String templateName = GeneratorConstant.SERVICE_TEMPLATE; | 
|         File serviceFile = new File(path); | 
|         generateFileByTemplate(templateName, serviceFile, toJsonObject(configure)); | 
|     } | 
|   | 
|     public void generateServiceImplFile(List<Column> columns, GeneratorConfig configure) throws Exception { | 
|         String suffix = GeneratorConstant.SERVICEIMPL_FILE_SUFFIX; | 
|         String path = getFilePath(configure, configure.getServiceImplPackage(), suffix, false); | 
|         String templateName = GeneratorConstant.SERVICEIMPL_TEMPLATE; | 
|         File serviceImplFile = new File(path); | 
|         generateFileByTemplate(templateName, serviceImplFile, toJsonObject(configure)); | 
|     } | 
|   | 
|     public void generateControllerFile(List<Column> columns, GeneratorConfig configure) throws Exception { | 
|         String suffix = GeneratorConstant.CONTROLLER_FILE_SUFFIX; | 
|         String path = getFilePath(configure, configure.getControllerPackage(), suffix, false); | 
|         String templateName = GeneratorConstant.CONTROLLER_TEMPLATE; | 
|         File controllerFile = new File(path); | 
|         generateFileByTemplate(templateName, controllerFile, toJsonObject(configure)); | 
|     } | 
|   | 
|     public void generateMapperXmlFile(List<Column> columns, GeneratorConfig configure) throws Exception { | 
|         String suffix = GeneratorConstant.MAPPERXML_FILE_SUFFIX; | 
|         String path = getFilePath(configure, configure.getMapperXmlPackage(), suffix, false); | 
|         String templateName = GeneratorConstant.MAPPERXML_TEMPLATE; | 
|         File mapperXmlFile = new File(path); | 
|         JSONObject data = toJsonObject(configure); | 
|         columns.forEach(c -> c.setField(FebsUtil.underscoreToCamel(StringUtils.lowerCase(c.getName())))); | 
|         data.put("columns", columns); | 
|         generateFileByTemplate(templateName, mapperXmlFile, data); | 
|     } | 
|   | 
|     @SuppressWarnings("UnstableApiUsage") | 
|     private void generateFileByTemplate(String templateName, File file, Object data) throws Exception { | 
|         Template template = getTemplate(templateName); | 
|         Files.createParentDirs(file); | 
|         FileOutputStream fileOutputStream = new FileOutputStream(file); | 
|         try (Writer out = new BufferedWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8), 10240)) { | 
|             template.process(data, out); | 
|         } catch (Exception e) { | 
|             String message = "代码生成异常"; | 
|             log.error(message, e); | 
|             throw new Exception(message); | 
|         } | 
|     } | 
|   | 
|     private static String getFilePath(GeneratorConfig configure, String packagePath, String suffix, boolean serviceInterface) { | 
|         String filePath = GeneratorConstant.TEMP_PATH + configure.getJavaPath() + | 
|                 packageConvertPath(configure.getBasePackage() + "." + packagePath); | 
|         if (serviceInterface) { | 
|             filePath += "I"; | 
|         } | 
|         filePath += configure.getClassName() + suffix; | 
|         return filePath; | 
|     } | 
|   | 
|     private static String packageConvertPath(String packageName) { | 
|         return String.format("/%s/", packageName.contains(".") ? packageName.replaceAll("\\.", "/") : packageName); | 
|     } | 
|   | 
|     private JSONObject toJsonObject(Object o) { | 
|         return JSONObject.parseObject(JSONObject.toJSON(o).toString()); | 
|     } | 
|   | 
|     private Template getTemplate(String templateName) throws Exception { | 
|         Configuration configuration = new freemarker.template.Configuration(Configuration.VERSION_2_3_23); | 
|         String templatePath = GeneratorHelper.class.getResource("/generator/templates/").getPath(); | 
|         File file = new File(templatePath); | 
|         if (!file.exists()) { | 
|             templatePath = System.getProperties().getProperty("java.io.tmpdir"); | 
|             file = new File(templatePath + "/" + templateName); | 
|             FileUtils.copyInputStreamToFile(Objects.requireNonNull(AddressUtil.class.getClassLoader().getResourceAsStream("classpath:generator/templates/" + templateName)), file); | 
|         } | 
|         configuration.setDirectoryForTemplateLoading(new File(templatePath)); | 
|         configuration.setDefaultEncoding("UTF-8"); | 
|         configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); | 
|         return configuration.getTemplate(templateName); | 
|   | 
|     } | 
| } |