package com.runt.android.actions; import com.intellij.openapi.actionSystem.AnAction; import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; /** * My father is Object, ites purpose of * * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-27. */ public abstract class BaseAction extends AnAction { protected final SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd"); /** * 生成参数变量代码 * @param args * @return */ public String getFields(String[] args, String keyWord){ StringBuilder fieldStr = new StringBuilder(); for(String field : args){ fieldStr.append(keyWord+" String "+humpName(field)+";\n");//创建参数变量,默认string } return fieldStr.toString(); } /** * 生成参数变量代码 * @param jsonStr json格式对象 * @return */ public String getFields(String jsonStr ){ return getFields(new JSONObject(jsonStr),"public"); } /** * 生成参数变量代码 * @param jsonStr json格式对象 * @param keyWord 关键字 public,private,protect等 * @return */ public String getFields(String jsonStr , String keyWord){ return getFields(new JSONObject(jsonStr),keyWord); } public String getFields(JSONObject jsonObject ) { return getFields(jsonObject,"public"); } public String getFields(JSONObject jsonObject , String keyWord){ StringBuilder fieldStr = new StringBuilder(); Map fieldMap = getFieldNormalMap(jsonObject); for(String clssName : fieldMap.keySet()){ if(fieldMap.get(clssName) instanceof List){ //创建参数变量, fieldStr.append(keyWord+" " + (clssName.toLowerCase().equals("null") ? "String":clssName) + " " ); List fields= (List) fieldMap.get(clssName); for(String field : fields){ if(fields.indexOf(field) == fields.size() -1 ){ fieldStr.append( field + ";\n"); }else{ fieldStr.append( field + ","); } } }else { //创建参数变量, fieldStr.append(keyWord+" " + (clssName.toLowerCase().equals("null") ? "String":clssName) + " " + fieldMap.get(clssName) + " ;\n"); } } return fieldStr.toString(); } /** * 获取json中解析的普通变量集合 * @param jsonStr * @return */ protected Map getFieldNormalMap(String jsonStr){ return getFieldNormalMap(new JSONObject(jsonStr)); } /** * 获取json中解析的普通变量集合 * @param jsonObject * @return */ protected Map getFieldNormalMap(JSONObject jsonObject){ Map fieldMap = new HashMap<>(); for(String key: jsonObject.keySet()){ Object obj = jsonObject.get(key); key = humpName(key); String clssName = obj.getClass().getSimpleName();//声明变量的数据类型 if(obj instanceof JSONArray){ clssName = "List"; }else if(obj instanceof JSONObject){ clssName = "Map"; } //将key作为声明的变量名 if(fieldMap.get(clssName) == null){//没有同数据类型的变量 fieldMap.put(clssName,key); }else if(fieldMap.get(clssName) instanceof List){//已有同数据类型的变量 List vlus = (List) fieldMap.get(clssName); vlus.add(key);//追加 }else {//已有同数据类型的变量,转变为集合 List vlus = new ArrayList(); String field = fieldMap.get(clssName).toString(); vlus.add(field); vlus.add(key);//追加 fieldMap.replace(clssName,vlus);//替换为集合 } } return fieldMap; } /** * 创建api返回类文件 */ protected void createApiFile(String filePath,String name, String fieldsStr,String packageName,String fileName,String[] fields ){ createApiFile(filePath,name,fieldsStr,packageName,fileName,fields,""); } /** * * 创建api返回类文件 * @param filePath 文件路径 * @param name 文件名称 * @param fieldsStr 声明变量字符串 * @param packageName 包名 * @param fileName 模版文件 * @param fields 变量名集合 * @param classStr 内部类代码字符 */ protected void createApiFile(String filePath,String name, String fieldsStr,String packageName,String fileName,String[] fields,String classStr){ createFile(filePath,name,fieldsStr,packageName,fileName,fields,classStr,"Result"); } /** * 创建数据类文件 * @param suffix 文件名后缀 */ protected void createFile(String filePath,String name, String fieldsStr,String packageName,String fileName,String[] fields,String classStr,String suffix){ try { String desc = name; if(name.indexOf(",")>-1){ desc = name.split(",")[1]; name = name.split(",")[0]; } name = toUperFirst(name); Properties prop = System.getProperties(); String template = getTemplateString(fileName) .replace("{desc}", desc) .replace("{date}", dateFormat.format(new Date())) .replace("{author}", prop.getProperty( "user.name" )+" "+prop.getProperty("os.name")) .replace("{fields}", fieldsStr) .replace("{name}", name) .replace("{class}",classStr) .replace("{package}",packageName) .replace("{toString}",getToString(name,fields)); File viewFile = new File(filePath, name+suffix+".java"); if (!viewFile.exists()) { viewFile.createNewFile(); } FileWriter fw = new FileWriter(viewFile.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(template); bw.close(); }catch (Exception e){ e.printStackTrace(); } } /** * 重写 toString * @param name * @param fields * @return */ protected String getToString(String name,String[] fields){ StringBuilder sb = new StringBuilder(); sb.append("@Override\n"); sb.append("public String toString() {\n"); sb.append("return \""+name+"{\" + \n"); for(String field : fields){ sb.append(" \""+humpName(field)+"=\" + "+humpName(field)+(field.equals(fields[fields.length-1])?"+":"+\",\"+")+"\n"); } sb.append("'}';\n"); sb.append("}\n"); return sb.toString(); } /** * 驼峰命名 * @param name * @return */ public String humpName(String name){ String[] strings = name.split("_"); StringBuilder sb = new StringBuilder(); sb.append(strings[0]); for(int i = 1 ; i < strings.length ; i ++){ sb.append(toUperFirst(strings[i])); } return sb.toString(); } /** * 首字母大写 * @param name * @return */ public String toUperFirst(String name){ return name.substring(0,1).toUpperCase()+name.substring(1); } /** * 获取模板字符串 */ public String getTemplateString(String fileName) { InputStream in = null; in = this.getClass().getResourceAsStream("/template/" + fileName); String content = ""; try { content = new String(readStream(in)); } catch (IOException e) { e.printStackTrace(); } return content; } private byte[] readStream(InputStream inputStream) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; try { while ((len = inputStream.read(buffer)) != -1){ outputStream.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); }finally { outputStream.close(); inputStream.close(); } return outputStream.toByteArray(); } }