Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import org.apache.commons.lang.StringUtils;
- import play.db.jpa.Model;
- import javax.persistence.Transient;
- import java.io.*;
- import java.lang.reflect.Field;
- import java.lang.reflect.Modifier;
- import java.math.BigDecimal;
- import java.sql.Timestamp;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.LinkedList;
- import java.util.List;
- /**
- * 代码生成器
- */
- public class CodeGenerator {
- private static final String PROJECT_PATH = System.getProperty("user.dir");//项目在硬盘上的基础路径
- private static final String MODEL_ILE_PATH = PROJECT_PATH + "/app/models/";//model路径
- private static final String AUTHOR = "lyl";//@author
- private static final String DATE = new SimpleDateFormat("yyyy/MM/dd").format(new Date());//@date
- /**
- * Gen code.
- *
- * @param classes the classes
- */
- public void genCode(Class... classes) {
- try {
- for (Class clazz : classes) {
- Field[] rawFields = getCurrentFields(clazz);
- Object o = clazz.newInstance();
- String primaryKeyField;
- boolean isExtendModel = false;
- if (isExtendModel = (o instanceof Model)) {
- primaryKeyField = "id";
- } else {
- primaryKeyField = findPrimaryKeyField(rawFields, clazz).getName();
- }
- String importPackage = genImport();
- String annotation = genAnnotation(clazz);
- String staticField = genStaticField(clazz, rawFields, primaryKeyField, isExtendModel);
- String method = genMethod(clazz, rawFields, isExtendModel);
- insertFile(clazz, importPackage, annotation, staticField, method);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private String genImport() {
- return ("import org.slf4j.Logger;\n" +
- "import org.slf4j.LoggerFactory;\n" +
- "import play.db.jpa.GenericModel;\n" +
- "import transaction.DBDispatcher;\n" +
- "import transaction.JDBCBuilder;\n" +
- "\n" +
- "import javax.persistence.Entity;\n" +
- "import javax.persistence.Id;\n" +
- "import java.sql.ResultSet;\n" +
- "import java.sql.SQLException;\n" +
- "import java.util.ArrayList;\n" +
- "import java.util.List;\n");
- }
- /**
- * 生成Annotation
- */
- private String genAnnotation(Class clazz) {
- String name = clazz.getSimpleName();
- return "@Entity(name = " + name + ".TABLE_NAME)\n";
- }
- /**
- * 生成静态字段
- */
- private String genStaticField(Class clazz, Field[] fileds, String primaryKyField, boolean isExtendModel) {
- String className = clazz.getSimpleName();
- Field[] fields = clazz.getFields();
- StringBuilder builder = new StringBuilder();
- builder.append(" private static final Logger LOGGER = LoggerFactory.getLogger(")
- .append(className).append(".class);\n");
- builder.append(" public static final String TAG = \"").append(className).append("\";\n");
- builder.append(" public static final String TABLE_NAME = \"")
- .append(splitClassName(className))
- .append("\";\n");
- builder.append(" private static final String ALL_PROPERTY = \"")
- .append(genFieldString(fileds, isExtendModel)).append("\";\n");
- builder.append(" private static final String QUERY_PREFIX = \"select \" + ALL_PROPERTY + \" from \" + TABLE_NAME + \" where \";\n");
- builder.append(" private static final String PARAM_HOLDERS = ALL_PROPERTY.replaceAll(\"\\\\w+\", \"?\");\n");
- builder.append(" private static final String UPDATE_PARAM_HOLDERS = ALL_PROPERTY.replaceFirst(\"")
- .append(primaryKyField)
- .append("\\\\s*,\", \"\").replaceAll(\",\", \" = ?,\") + \"= ? \";\n");
- builder.append(" public static final DBDispatcher DP = new DBDispatcher();\n");
- builder.append("\n");
- return builder.toString();
- }
- private boolean isExistField(Class clazz, String fieldName) {
- Field[] fields = clazz.getFields();
- for (Field field : fields) {
- if (field.getName().equalsIgnoreCase(fieldName)) {
- return true;
- }
- }
- return false;
- }
- private String genMethod(Class clazz, Field[] rawFields, boolean isExtendModel) {
- StringBuilder builder = new StringBuilder();
- String queryMethod = genQueryMethod(clazz, rawFields, isExtendModel);
- String jdbcMethod = genJDbcMethod(clazz, rawFields, isExtendModel);
- return builder.append("\n").append(queryMethod).append(jdbcMethod).toString();
- }
- private String genQueryMethod(Class clazz, Field[] rawFields, boolean isExtendModel) {
- String className = clazz.getSimpleName();
- Field field = findPrimaryKeyField(rawFields, clazz);
- StringBuilder builder = new StringBuilder();
- /*
- * 用主键获取单个entity
- * */
- builder.append(" public static ").append(className).append(" find").append(className).append("By");
- if (isExtendModel) {
- builder.append("Id(int id) {\n");
- } else {
- builder.append(changeFieldFirstCharToUpperCase(field.getName()))
- .append("(")
- .append(getFieldClassString(field.getType()))
- .append(" ")
- .append(field.getName())
- .append(") {\n");
- }
- builder.append(" String query = QUERY_PREFIX + \"").append(field.getName()).append("=?\";\n");
- builder.append(" return findOne(query, ").append(field.getName()).append(");\n");
- builder.append(" }\n");
- builder.append("\n");
- /*
- * 自定义查询entity
- * */
- builder.append(" public static List<").append(className).append("> find").append(className).append("List(String query, Object... params) {\n");
- builder.append(" query = QUERY_PREFIX + query;\n");
- builder.append(" return findList(query, params);\n");
- builder.append(" }\n");
- builder.append("\n");
- return builder.toString();
- }
- private String genJDbcMethod(Class clazz, Field[] rawFields, boolean isExtendModel) {
- String className = clazz.getSimpleName();
- String varName = changeClassNameToVariable(className);
- String listName = changeClassNameToVariableList(className);
- Field field = findPrimaryKeyField(rawFields, clazz);
- StringBuilder builder = new StringBuilder();
- /*
- * 插入
- * */
- builder.append(" public boolean rawInsert() {\n");
- builder.append(" String sql = \"insert into \" + TABLE_NAME + \"(\" + ALL_PROPERTY + \")\" +\n");
- builder.append(" \" values(\" + PARAM_HOLDERS + \")\";\n");
- builder.append(" long returnId = DP.insert(sql, ").append(genFieldString(rawFields, isExtendModel)).append(");\n");
- builder.append(" return returnId > 0L;\n");
- builder.append(" }\n");
- builder.append("\n");
- /*
- * 更新
- * */
- builder.append(" public boolean update() {\n");
- builder.append(" String sql = \"update \" + TABLE_NAME + \" set \" + UPDATE_PARAM_HOLDERS + \" where ");
- if (isExtendModel) {
- builder.append("id");
- } else {
- builder.append(field.getName());
- }
- builder.append("=?\";\n");
- builder.append(" long returnId = DP.update(sql, ");
- String allField = genFieldString(rawFields, isExtendModel);
- if (isExtendModel) {
- allField = allField.replaceAll("null,", "");
- allField = allField + ",id";
- } else {
- allField = allField.replaceFirst("\\w*,", "");
- allField = allField + "," + field.getName();
- }
- builder.append(allField);
- builder.append(");\n");
- builder.append(" return returnId > 0L;\n");
- builder.append(" }\n");
- builder.append("\n");
- /*
- * 查找单个entity jdbc实现
- * */
- builder.append(" private static ").append(className).append(" findOne").append("(String query, Object... param) {\n");
- builder.append(" return new JDBCBuilder.JDBCExecutor<").append(className).append(">(DP, query, param) {\n");
- builder.append(" @Override\n");
- builder.append(" public ").append(className).append(" doWithResultSet(ResultSet rs) throws SQLException {\n");
- builder.append(" while (rs.next()) {\n");
- builder.append(" ").append(className).append(" ").append(varName).append(" = parse").append(className).append("(rs);\n");
- builder.append(" if (").append(varName).append(" != null) {\n");
- builder.append(" return ").append(varName).append(";\n");
- builder.append(" }\n");
- builder.append(" }\n");
- builder.append(" return null;\n");
- builder.append(" }\n");
- builder.append(" }.call();\n");
- builder.append(" }\n");
- builder.append("\n");
- /*
- * 查找entity列表 jdbc实现
- * */
- builder.append(" private static List<").append(className).append("> findList(String query, Object... params) {\n");
- builder.append(" return new JDBCBuilder.JDBCExecutor<List<").append(className).append(">>(DP, query, params) {\n");
- builder.append(" @Override\n");
- builder.append(" public List<").append(className).append("> doWithResultSet(ResultSet rs) throws SQLException {\n");
- builder.append(" List<").append(className).append("> ").append(listName).append(" = new ArrayList<").append(className).append(">();\n");
- builder.append(" while (rs.next()) {\n");
- builder.append(" ").append(className).append(" ").append(varName).append(" = parse").append(className).append("(rs);\n");
- builder.append(" if (").append(varName).append(" != null) {\n");
- builder.append(" ").append(listName).append(".add(").append(varName).append(");\n");
- builder.append(" }\n");
- builder.append(" }\n");
- builder.append(" return ").append(listName).append(";\n");
- builder.append(" }\n");
- builder.append(" }.call();\n");
- builder.append(" }\n");
- builder.append("\n");
- /*
- * jdbc转entity
- * */
- builder.append(" private static ").append(className).append(" parse").append(className).append("(ResultSet rs) {\n");
- builder.append(" ").append(className).append(" ").append(varName).append(" = new ").append(className).append("();\n");
- builder.append(" try {\n");
- for (Field f : rawFields) {
- builder.append(" ")
- .append(varName).append(".")
- .append(f.getName())
- .append(" = rs.get")
- .append(getFieldClassStringInResultSet(f.getType()))
- .append("(\"").append(f.getName()).append("\");\n");
- }
- builder.append(" return ").append(varName).append(";\n");
- builder.append(" } catch (SQLException e) {\n");
- builder.append(" e.printStackTrace();\n");
- builder.append(" }\n");
- builder.append(" return null;\n");
- builder.append(" }\n");
- builder.append("\n");
- return builder.toString();
- }
- /**
- * 区分是否为数据库需要的字段
- */
- private Field[] getCurrentFields(Class clazz) {
- Field[] fields = clazz.getFields();
- List<Field> fieldList = new LinkedList<Field>();
- for (Field field : fields) {
- if (field.isAnnotationPresent(Transient.class)) {
- continue;
- }
- if (Modifier.isTransient(field.getModifiers())) {
- continue;
- }
- if (Modifier.isStatic(field.getModifiers())) {
- continue;
- }
- fieldList.add(field);
- }
- return fieldList.toArray(new Field[0]);
- }
- /**
- * 找到Id项
- */
- private Field findPrimaryKeyField(Field[] rawFields, Class clazz) {
- for (Field field : rawFields) {
- if (field.isAnnotationPresent(javax.persistence.Id.class)) {
- return field;
- }
- }
- throw new RuntimeException("未找到primary key,请继承Model或添加@id");
- }
- /**
- * 将内容插入文件
- */
- private void insertFile(Class clazz, String importPackage, String annotation, String staticField, String method) throws UnsupportedEncodingException {
- File file = new File(MODEL_ILE_PATH, clazz.getSimpleName() + ".java");
- String content = getFileContent(file);
- content = clearOld(content, clazz);
- content = insertImport(importPackage, content);
- content = insertAnnotation(annotation, content);
- content = insertStaticField(staticField, content);
- content = insertMethod(method, content);
- try {
- BufferedWriter out = new BufferedWriter(new FileWriter(file));
- out.write(content);
- out.close();
- } catch (IOException e) {
- }
- }
- private String clearOld(String content, Class clazz) {
- String[] strings = content.split("\n");
- if (strings.length == 1) {
- strings = content.split("\r\n");
- }
- List<String> lineList = new ArrayList<String>();
- Field key = findPrimaryKeyField(clazz.getFields(), clazz);
- String keyName;
- if (key == null) {
- keyName = "id";
- } else {
- keyName = key.getName();
- }
- int flag = 0;
- int leftParenthesis = 0;
- int rightParenthesis = 0;
- for (int i = 0; i < strings.length; i++) {
- String line = strings[i];
- if (flag == 1) {
- if (leftParenthesis == rightParenthesis) {
- flag = 0;
- leftParenthesis = 0;
- rightParenthesis = 0;
- continue;
- }
- line = line.trim().replaceAll("[\\n\\r]", "");
- int len = line.length();
- int leftIndex = line.lastIndexOf("{");
- int rightIndex = line.indexOf("}");
- if (leftIndex == -1 && rightIndex == -1) {
- continue;
- }
- if (leftIndex == len - 1) {
- leftParenthesis += 1;
- }
- if (rightIndex == 0) {
- rightParenthesis += 1;
- }
- continue;
- }
- if (needClearAnnotation(line)) {
- continue;
- } else if (needClearStaticField(line)) {
- continue;
- } else if (needClearMethod(line, clazz, keyName)) {
- flag = 1;
- leftParenthesis = 1;
- continue;
- }
- lineList.add(line);
- }
- String[] lines = lineList.toArray(new String[0]);
- return StringUtils.join(lines, "\n");
- }
- private boolean needClearAnnotation(String line) {
- return line.contains("@Entity(name");
- }
- private boolean needClearStaticField(String line) {
- return line.contains("LoggerFactory.getLogger")
- || line.contains("public static final String TAG")
- || line.contains("public static final String TABLE_NAME")
- || line.contains("private static final String ALL_PROPERTY")
- || line.contains("private static final String QUERY_PREFIX")
- || line.contains("private static final String PARAM_HOLDERS")
- || line.contains("private static final String UPDATE_PARAM_HOLDERS")
- || line.contains("public static final DBDispatcher DP");
- }
- private boolean needClearMethod(String line, Class clazz, String keyName) {
- String className = clazz.getSimpleName();
- return line.contains("public static " + className + " find" + className + "By" + changeFieldFirstCharToUpperCase(keyName))
- || line.contains("public static List<" + className + "> find" + className + "List")
- || line.contains("public boolean rawInsert()")
- || line.contains("public boolean update()")
- || line.contains("private static " + className + " findOne")
- || line.contains("private static List<" + className + "> findList")
- || line.contains("private static " + className + " parse" + className);
- }
- /**
- * 插入import
- */
- private String insertImport(String importPackage, String content) {
- int importIndex = findImportInsertIndex(content);
- return content.substring(0, importIndex) + importPackage + content.substring(importIndex);
- }
- /**
- * 插入Annotation
- */
- private String insertAnnotation(String annotation, String content) {
- int annotationIndex = findAnnotationInsertIndex(content);
- return content.substring(0, annotationIndex) + annotation + content.substring(annotationIndex);
- }
- /**
- * 插入方法
- */
- private String insertMethod(String method, String content) {
- int methodIndex = findMethodInsertIndex(content);
- return content.substring(0, methodIndex) + method + content.substring(methodIndex);
- }
- /**
- * 插入静态字段
- */
- private String insertStaticField(String staticField, String content) {
- int headIndex = findStaticFieldInsertIndex(content);
- return content.substring(0, headIndex + 3) + staticField + content.substring(headIndex + 3);
- }
- /**
- * 寻找插入import的索引位置
- */
- private int findImportInsertIndex(String content) {
- return content.indexOf("import ");
- }
- /**
- * 寻找插入annotation的索引位置
- */
- private int findAnnotationInsertIndex(String content) {
- return content.indexOf("public class");
- }
- /**
- * 寻找插入静态字段的索引位置
- */
- private int findStaticFieldInsertIndex(String content) {
- int index = content.indexOf("{\r\n");
- if (index == -1) {
- index = content.indexOf("{\n");
- }
- return index;
- }
- /**
- * 寻找插入方法的索引位置
- */
- private int findMethodInsertIndex(String content) {
- return content.lastIndexOf("}");
- }
- /**
- * 获取文件内容
- */
- private String getFileContent(File file) throws UnsupportedEncodingException {
- String encoding = "utf-8";
- Long filelength = file.length();
- byte[] filecontent = new byte[filelength.intValue()];
- try {
- FileInputStream in = new FileInputStream(file);
- in.read(filecontent);
- in.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return new String(filecontent, encoding);
- }
- /**
- * 生成字段string
- */
- private String genFieldString(Field[] fields, boolean isExtendModel) {
- int len = fields.length;
- String[] strings = new String[len];
- if (isExtendModel) {
- strings[0] = "null";
- for (int i = 0, fieldIndex = i; fieldIndex < len; fieldIndex++) {
- String name = fields[fieldIndex].getName();
- if (name.equals("id")) {
- continue;
- }
- strings[i + 1] = name;
- i++;
- }
- } else {
- for (int i = 0; i < len; i++) {
- strings[i] = fields[i].getName();
- }
- }
- return StringUtils.join(strings, ",");
- }
- /**
- * 按大小写分隔类名
- *
- * @param className 类名
- * @return
- */
- private String splitClassName(String className) {
- int index = 0;
- ArrayList arrayList = new ArrayList<String>();
- for (int i = 1; i < className.length(); i++) {
- if (Character.isUpperCase(className.charAt(i))) {
- arrayList.add(className.substring(index, i).toLowerCase());
- index = i;
- }
- }
- arrayList.add(className.substring(index, className.length()).toLowerCase());
- String[] strings = (String[]) arrayList.toArray(new String[0]);
- return StringUtils.join(strings, "_");
- }
- /**
- * 获取字段类型的string
- *
- * @param fieldClass the field class
- * @return the field class string
- */
- public static String getFieldClassString(Class<?> fieldClass) {
- String type = null;
- if (fieldClass == Long.class || fieldClass == long.class) {
- type = "Long";
- } else if (fieldClass == Integer.class || fieldClass == int.class) {
- type = "Integer";
- } else if (fieldClass == Double.class || fieldClass == double.class) {
- type = "Double";
- } else if (fieldClass == String.class) {
- type = "String";
- } else if (fieldClass == Boolean.class || fieldClass == boolean.class) {
- type = "Boolean";
- } else if (fieldClass == BigDecimal.class) {
- type = "BigDecimal";
- } else if (fieldClass == Date.class) {
- type = "Date";
- }else if (fieldClass == Timestamp.class) {
- type = "Timestamp";
- }
- return type;
- }
- public static String getFieldClassStringInResultSet(Class<?> fieldClass) {
- if (fieldClass == Integer.class || fieldClass == int.class) {
- return "Int";
- } else {
- return getFieldClassString(fieldClass);
- }
- }
- private String changeClassNameToVariable(String className) {
- String s = className.substring(0, 1).toLowerCase();
- return s + className.substring(1);
- }
- private String changeClassNameToVariableList(String className) {
- return changeClassNameToVariable(className) + "List";
- }
- private String changeFieldFirstCharToUpperCase(String name) {
- return name.substring(0, 1).toUpperCase() + name.substring(1);
- }
- }
Add Comment
Please, Sign In to add comment