首页 > 代码库 > 自动代码复制工具

自动代码复制工具

工具用途:

平时开发程序的时候,如果要在系统里新增一个模块,通常会复制已有的代码文件,然后再做一些修改。如果已有一个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();
	}

}


复制文件和源文件对比: