import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
public class InsertLogIntoFile {
private static List<String> list = new LinkedList<>();
private static final String resourceLocation = "/H:/git_studyspace/spring/src/main/java/org";
private static final String loggerPath = "lsh.spring.util.Log.info();";
private static final String methodMarks = "byte,short,int,long,float,double,boolean,char,void";
public static void main(String[] args) {
readJavaFile(new File(resourceLocation));
}
public static String getCurrentPath(Class<?> clazz) {
return clazz.getResource(".").getPath();
}
private static void readJavaFile(File file) {
if(file.isDirectory()) {
File[] files = file.listFiles();
for (File unit : files) {
if(unit.isFile()) {//如果是文件,则进行进一步的编辑
if(unit.getName().endsWith("InsertLogIntoFile.java")
|| unit.getName().contains("AddLogToFile.java")
|| unit.getName().contains("Log.java")) {
continue;
}
judgeLineByLine(unit.getAbsolutePath());
}else {
readJavaFile(unit);
}
}
}else {
if(file.getName().endsWith("InsertLogIntoFile.java")
|| file.getName().contains("AddLogToFile.java")
|| file.getName().contains("Log.java")) {
return;
}
judgeLineByLine(file.getAbsolutePath());
}
}
private static void judgeLineByLine(String file) {
BufferedReader br = null;
try {
//先将文件都按行读取到缓存中
br = new BufferedReader(new FileReader(file));
String line = null;
while((line = br.readLine()) != null) {
list.add(line);
}
br.close();
//从缓存中读取文件内容时按需要修改内容,重新写入到文件当中
BufferedWriter bw = null;
bw = new BufferedWriter(new FileWriter(file));
for (String string : list) {
if(file.endsWith(".java")) {
String newLine = judgeMethodLocation(string);
bw.write(newLine);
bw.write("\n");
}else {
bw.write(string);
bw.write("\n");
}
}
list.clear();
bw.write("\n");
bw.flush();
bw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//判断方法签名所在行,如果是方法签名,则在下一行插入日志并返回字符串
private static String judgeMethodLocation(String str) {
if(!(str.trim().contains("(")&&str.contains(")")&&str.contains("{")&&!str.contains("}"))||str.trim().startsWith("//")) {
return str;
}
String[] arr = str.split("[(]");
int mark = str.indexOf("(");
//如果按照“(”进行字符串拆分得到的长度不小于2,且原字符串中字符“(”的前一个字符不为空
if(arr.length == 2 && (str.toCharArray()[mark-1] !=' ')) {
String[] arr2 = arr[arr.length-2].split(" ");
int length2 = arr2.length;
if(startWithLowerCase(arr2[length2 - 1]) &&length2 >= 2 && (startWithUpperCase(arr2[length2-2]) || matchBasicType(arr2[length2-2]))) {
return insertLoggerCommand(str);
}
}
return str;
}
private static boolean startWithUpperCase(String str) {
if(str.trim().length() == 0) {
return false;
}
String regex = "[A-Z]";
Pattern p = Pattern.compile(regex);
return p.matcher(str.substring(0, 1)).matches();
}
private static boolean startWithLowerCase(String str) {
if(str.trim().length() == 0) {
return false;
}
String regex = "[a-z]";
Pattern p = Pattern.compile(regex);
return p.matcher(str.substring(0, 1)).matches();
}
public static boolean matchBasicType(String str) {
String[] arr = methodMarks.split(",");
for (String string : arr) {
if(string.equals(str) || (string+"[]").equals(string)) {
return true;
}
}
return false;
}
//插入日志
private static String insertLoggerCommand(String lineStr) {
StringBuilder sb = new StringBuilder(lineStr);
sb.append("\n ")
.append(loggerPath);
return sb.toString();
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Log {
private static int count = 0;
private static PrintStream ps = null;
static {
try {
ps = new PrintStream(new File("beanDefinitionLoad.md"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
}
public static void info() {
StackTraceElement[] ste = new Exception().getStackTrace();
String className = ste[1].getClassName();
String methodName = ste[1].getMethodName();
int lineNumber = ste[1].getLineNumber();
StringBuilder sb = new StringBuilder();
for (int i=0; i <= count; i++) {
sb.append(" ");
}
count++;
ps.println(sb+"["+className+"."+methodName+": "+lineNumber+"]");
if(count == 30) {
count = 0;
}
}
public static void info(String str) {
StackTraceElement[] ste = new Exception().getStackTrace();
String className = ste[1].getClassName();
String methodName = ste[1].getMethodName();
int lineNumber = ste[1].getLineNumber();
StringBuilder sb = new StringBuilder();
for (int i=0; i <= count; i++) {
sb.append(" ");
}
count++;
System.out.println(sb+"["+className+"."+methodName+": "+lineNumber+"] "+str);
if(count == 30) {
count = 0;
}
}
}