自动代码复制工具
2014-08-01 02:10 每天努力一点点 阅读(909) 评论(0) 编辑 收藏 举报工具用途:
平时开发程序的时候,如果要在系统里新增一个模块,通常会复制已有的代码文件,然后再做一些修改。如果已有一个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