工具用途:
平時開發程序的時候,如果要在系統裏新增一個模塊,通常會複製已有的代碼文件,然後再做一些修改。如果已有一個User的增刪改查模塊,此時要新增一個對Student的類似模塊,我們就會複製User的Action/Dao/jsp頁面等所有java類,然後對裏面的內容進行修改。
對於上面的步驟,當再次新增其他模塊時,還會再次重複執行:
1.逐個複製各個文件
2.按關鍵字進行替換(如上面樣例中,需要將User替換爲Student)
3.根據業務差異,進行修改
本工具用於自動完成上面步驟中前兩個步驟,達到加快代碼開發的目的。
PS:如果代碼模塊是基於一種標準的SSH模式來編寫的,自然可以採用標準的代碼生成工具來生成全套代碼,網上也有很多類似的工具,但是縱觀各個不同公司的代碼,風格各異,很難有一個統一的代碼生成工具來生成合適的全套代碼,所以這種複製修改的方法反而更適用一些。
工具代碼實現:
package cn.jerryhouse.util.cc;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.LinkedList;
import java.util.List;
public class CodeCopier {
private List<String> srcFileList = new LinkedList<String>();
private String srcBaseDir;
private String destBaseDir;
private List<ReplacePair> replacePairList = new LinkedList<ReplacePair>();
private final String NEW_LINE = System.getProperty("line.separator");
public void process()
{
for(String filePath: srcFileList)
{
String destFilePath = getDestFilePath(filePath);
copyAndModifyFile(filePath,destFilePath);
}
}
private String getDestFilePath(String srcFilePath)
{
File srcFile = new File(srcFilePath);
String srcFileName = srcFile.getName();
String srcFileDir = srcFile.getParent();
String destFileName = getDestFileName(srcFileName);
String destFilePath = this.destBaseDir+srcFileDir.substring(srcBaseDir.length())+File.separator+destFileName;
return destFilePath;
}
private String getDestFileName(String srcFilePath)
{
return updateContentByPattern(srcFilePath);
}
private void copyAndModifyFile(String srcFilePath,String destFilePath)
{
try {
mkdirsForFilePath(destFilePath);
BufferedReader br = new BufferedReader(new FileReader(srcFilePath));
BufferedWriter bw = new BufferedWriter(new FileWriter(destFilePath));
String line;
while((line=br.readLine())!=null)
{
String updatedLine = updateContentByPattern(line);
bw.write(updatedLine+NEW_LINE);
}
br.close();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void mkdirsForFilePath(String filePath)
{
File file = new File(filePath);
file.getParentFile().mkdirs();
}
private String updateContentByPattern(String content)
{
for(ReplacePair replacePair: replacePairList)
{
content = content.replaceAll(replacePair.getToReplacePattern(), replacePair.getReplacement());
}
return content;
}
public void addReplacePair(String toReplacePattern,String replacement)
{
replacePairList.add(new ReplacePair(toReplacePattern,replacement));
}
public void addSrcFile(String srcFilePath)
{
srcFileList.add(srcFilePath);
}
public void setSrcBaseDir(String srcBaseDir) {
this.srcBaseDir = srcBaseDir;
}
public void setDestBaseDir(String destBaseDir) {
this.destBaseDir = destBaseDir;
}
}
package cn.jerryhouse.util.cc;
public class ReplacePair {
private String toReplacePattern;
private String replacement;
public ReplacePair(String toReplacePattern,String replacement)
{
this.toReplacePattern = toReplacePattern;
this.replacement = replacement;
}
public String getToReplacePattern() {
return toReplacePattern;
}
public void setToReplacePattern(String toReplacePattern) {
this.toReplacePattern = toReplacePattern;
}
public String getReplacement() {
return replacement;
}
public void setReplacement(String replacement) {
this.replacement = replacement;
}
}
測試代碼:
package cn.jerryhouse.util.cc.test;
import org.junit.Test;
import cn.jerryhouse.util.cc.CodeCopier;
public class CodeCopierTest {
@Test
public void testProcess() {
CodeCopier codeCopier = new CodeCopier();
codeCopier.setSrcBaseDir("D:/tmp/sshExample2");
codeCopier.setDestBaseDir("D:/tmp1/sshExample2");
codeCopier.addSrcFile("D:/tmp/sshExample2/src/cn/jerry/ssh/mdv/action/UserAction.java");
codeCopier.addSrcFile("D:/tmp/sshExample2/src/cn/jerry/ssh/mdv/dao/UserDaoImp.java");
codeCopier.addReplacePair("User", "Student");
codeCopier.addReplacePair("user", "student");
codeCopier.process();
}
}
複製文件和源文件對比:
轉載請註明出處:http://blog.csdn.net/u014569459/article/details/38327339