package org.lams.toolbuilder.renameTool; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.List; import java.util.Set; import org.lams.toolbuilder.util.LamsToolBuilderLog; /** * * @author Luke Foxton - Based on code written by: Anthony Sukar * */ public class RenameTool { //$$$$$$$$$$$$$$$$$$$$$$TO BE IMPLEMENTED DYNAMICALLY private final String DEFAULT_LANGUAGE = "en_AU"; private String sourceDirStr; private Set txtType = new HashSet(); private List nameList; public RenameTool() { txtType.add("clay"); txtType.add("classpath"); txtType.add("txt"); txtType.add("cvsignore"); txtType.add("html"); txtType.add("htm"); txtType.add("java"); txtType.add("js"); txtType.add("jsp"); txtType.add("MF"); txtType.add("bat"); txtType.add("myd"); txtType.add("mymetadata"); txtType.add("project"); txtType.add("properties"); txtType.add("sh"); txtType.add("sql"); txtType.add("tag"); txtType.add("log"); txtType.add("tld"); txtType.add("xml"); } public boolean renameTool(List nameList, String source) throws Exception { this.nameList = nameList; this.sourceDirStr = source; File sourceDir = new File(sourceDirStr); if (!sourceDir.exists()) { LamsToolBuilderLog.logError(new FileNotFoundException("Source file: " + sourceDirStr + "not found.")); throw new FileNotFoundException("Source file: " + sourceDirStr + "not found."); } visitFile(sourceDir, "rename"); return true; } public void renameFile(File dir) { for (String[] pair : nameList) { String newFileName = updateFilename(dir.getName(), pair[0], pair[1]); dir.renameTo(new File(dir.getParentFile(), newFileName)); } } private String updateFilename(String currentFileName, String regex, String replacement) { String newFileName = currentFileName.replaceAll(regex, replacement); if (!currentFileName.equals(newFileName)) { String format = "Renamed %1$-40s ---> %2$-1s\n"; System.out.format(format, currentFileName, newFileName); } return newFileName; } public void replaceText(File file) { try { FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); File tmpfile = File.createTempFile("rename", "tmp", file .getParentFile()); BufferedWriter bw = new BufferedWriter(new FileWriter(tmpfile)); String line; while ((line = br.readLine()) != null) { int replaceCount = 0; String[] replaceStrings = new String[] {}; for (String[] pair : nameList) { System.out.print("Line: " + line + " replaced with: "); line = line.replaceAll(pair[0], pair[1]); System.out.print(line + "\n"); replaceStrings[replaceCount] = pair[1]; replaceCount++; } bw.write(line); bw.newLine(); } bw.close(); br.close(); String fileName = file.getName(); file.delete(); tmpfile.renameTo(new File(tmpfile.getParentFile(), fileName)); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void visitFile(File file, String mode) { boolean rename=true; if (file.isDirectory() && (file.getName().equals("CVS") || file.getName().equals( "build"))) { mode = "delete"; } // Do not rename the root directory of the tool if (file.isDirectory() && file.getName().equals(sourceDirStr.substring(sourceDirStr.lastIndexOf("/")+1))) { rename = false; } if (file.getName().contains("ApplicationResources")) { // it is a language file, delete if not the default language // if it is the default language, do not alter it if (file.getName().contains(this.DEFAULT_LANGUAGE)) { return; } else { file.delete(); System.out.println("Deleted non-default language file: " + file.getPath()); } } if (file.isDirectory()) { String[] children = file.list(); for (int i = 0; i < children.length; i++) { visitFile(new File(file, children[i]), mode); } } if (mode.equals("rename") && rename==true) { if (file.isFile()) { String[] a = file.getName().split("\\."); if ((a.length == 1) || txtType.contains(a[a.length-1])) { replaceText(file); } } renameFile(file); } if (mode.equals("delete")) { file.delete(); System.out.println("Deleted file: " + file.getPath()); } } public File getFile(String[] array) { // merge remaining array elements and restoring spaces. String path = ""; for (int i = 1; i < array.length; i++) { path += array[i] + " "; } return new File(path.trim()); } }