自動代碼複製工具

工具用途:

平時開發程序的時候,如果要在系統裏新增一個模塊,通常會複製已有的代碼文件,然後再做一些修改。如果已有一個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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章