import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javafx.util.Pair; import jdk.nashorn.internal.runtime.regexp.joni.Regex; public class Generator { private static final char CSV_LIST_SEPARATOR = '|'; private static final String ENUM_CLASS_NAME = "ErrorEnum"; private static final String FILE_SUFFIX_NAME = "java"; private String inputFile; private String outputDir; private List attributeList; public Generator(String inputFile, String outputDir) { this.inputFile = inputFile; this.outputDir = outputDir; } public void generate() { Map> dataMap = obtainDataMap(); generateConstantFile(dataMap); generateEnumFile(dataMap); } private void generateConstantFile(Map> dataMap) { for (String attribute : attributeList) { String className = toBigHump(attribute); String filePath = obtainOutputFilePath(className); String content = obtainConstantTemplate(className, attribute, dataMap); generateFile(filePath, content); } } private void generateEnumFile(Map> dataMap) { String className = ENUM_CLASS_NAME; String filePath = obtainOutputFilePath(className); String content = obtainEnumTemplate(className, dataMap); generateFile(filePath, content); } private Map> obtainDataMap() { List> dataList = new ArrayList<>(); List rowList = parseFile(inputFile); for (String row : rowList) { dataList.add(splitRowData(row)); } attributeList = dataList.remove(0); Map> dataMap = new LinkedHashMap<>(); int attributeSize = attributeList.size(); for (List rowDataList : dataList) { fillList(rowDataList, attributeSize); String name = obtainLabelName(rowDataList.get(0)); Map itemMap = new LinkedHashMap<>(); dataMap.put(name, itemMap); for (int index = 0; index < attributeSize; index++) { String attribute = attributeList.get(index); String data = rowDataList.get(index); itemMap.put(attribute, data); } } return dataMap; } private List splitRowData(String row) { List list = new ArrayList<>(); String regex = String.format("\\%s", CSV_LIST_SEPARATOR); String[] rowArr = row.split(regex); for (String data : rowArr) { list.add(data.trim()); } return list; } private List fillList(List list, int size) { if (list.size() < size) { for (int index = 0; index < size - list.size(); index++) { list.add(""); } } return list; } private String obtainLabelName(String name) { String regex = "\\s+"; return name.trim().replaceAll(regex, "_").toUpperCase(); } private String obtainPropertyName(String property) { return toSmallHump(property); } private String toBigHump(String str) { return toHump(str, false); } private String toSmallHump(String str) { return toHump(str, true); } private String toHump(String str, boolean isSmallHump) { StringBuilder builder = new StringBuilder(); String[] strArr = str.split("[ _-]"); String subStr = ""; for (int index = 0; index < strArr.length; index++) { subStr = strArr[index]; if (index != 0 || !isSmallHump) { subStr = capitalize(subStr); } builder.append(subStr); } return builder.toString(); } public String capitalize(String str) { return str.substring(0, 1).toUpperCase() + str.substring(1); } private String obtainConstantTemplate(String className, String attribute, Map> dataMap) { StringBuilder builder = new StringBuilder(); builder.append("public interface ").append(className).append(" {\n"); for (Map.Entry> data : dataMap.entrySet()) { String format = String.format("\tString %s = \"%s\";\n", data.getKey(), data.getValue().get(attribute)); builder.append(format); } builder.append("}\r\n"); return builder.toString(); } private String obtainEnumTemplate(String className, Map> dataMap) { String format = "public enum %s {\n" + "%s\n" + "%s\n" + "%s\n" + "%s" + "}"; return String.format(format, className, obtainEnumDataList(dataMap), obtainEnumConstructor(className), obtainEnumProperty(), obtainEnumPropertyGetter()); } private String obtainEnumDataList(Map> dataMap) { StringBuilder builder = new StringBuilder(); List propertyList = obtainEnumPropertyList(); ArrayList nameList = new ArrayList<>(dataMap.keySet()); for (int index = 0; index < nameList.size(); index++) { String separator = index < nameList.size() - 1 ? "," : ";"; String name = nameList.get(index); Map itemMap = dataMap.get(name); String propertyArrString = propertyList.stream() .map(property -> String.format("\"%s\"", itemMap.get(property))) .collect(Collectors.joining(", ", "(", ")")); builder.append("\t").append(name).append(propertyArrString).append(separator).append("\n"); } return builder.toString(); } private String obtainEnumConstructor(String className) { StringBuilder builder = new StringBuilder(); List propertyList = obtainEnumPropertyList(); String propertyArrString = propertyList.stream() .map(property -> String.format("String %s", obtainPropertyName(property))) .collect(Collectors.joining(", ", "(", ")")); builder.append("\t").append(className).append(propertyArrString).append(" {\n"); for (String property : propertyList) { builder.append("\t\tthis.").append(property).append(" = ").append(property).append(";\n"); } builder.append("\t}\n"); return builder.toString(); } private String obtainEnumProperty() { StringBuilder builder = new StringBuilder(); List propertyList = obtainEnumPropertyList(); for (String property : propertyList) { builder.append("\tprivate String ").append(obtainPropertyName(property)).append(";\n"); } return builder.toString(); } private String obtainEnumPropertyGetter() { StringBuilder builder = new StringBuilder(); List propertyList = obtainEnumPropertyList(); for (String property : propertyList) { builder.append("\tpublic String get").append(toBigHump(property)).append("() {\n"); builder.append("\t\treturn ").append(obtainPropertyName(property)).append(";\n").append("\t}\n\n"); } return builder.toString(); } private List obtainEnumPropertyList() { return attributeList; } private String obtainOutputFilePath(String name) { preGenerateDir(outputDir); return String.format("%s%s%s.%s", outputDir, File.separator, name, FILE_SUFFIX_NAME); } private void preGenerateDir(String directory) { File file = new File(directory); if (!file.exists() && !file.isDirectory()) { file.mkdirs(); } } private File preGenerateFile(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { file.createNewFile(); } return file; } private void generateFile(String filePath, String content) { PrintWriter writer = null; try { File file = preGenerateFile(filePath); writer = new PrintWriter(new FileOutputStream(file)); writer.write(content); writer.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) { writer.close(); } } } private List parseFile(String filePath) { List list = new ArrayList<>(); BufferedReader reader = null; try { String line; reader = new BufferedReader(new FileReader(filePath)); while ((line = reader.readLine()) != null) { list.add(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return list; } public static void main(String[] args) { String currentPath = new File("").getAbsolutePath(); String inputFile = currentPath + File.separator + "error-code.csv"; String outputDir = currentPath + File.separator + "output" + File.separator + "java"; new Generator(inputFile, outputDir).generate(); } }