package gov.nih.nci.cagrid.common.releasetools; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.filter.Filter; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; public class ClasspathFixer { private String baseSearchDir = null; public ClasspathFixer(String baseSearchDir) { this.baseSearchDir = baseSearchDir; } public void startFixing() { List<File> classpathFiles = recursiveListFiles(new File(baseSearchDir), new FileFilter() { public boolean accept(File pathname) { return pathname.getName().equals(".classpath"); } }); for (File f : classpathFiles) { if (f.isFile()) { System.out.println("Working on " + f.getAbsolutePath()); try { Document doc = fileToDocument(f); List libElements = doc.getRootElement().getContent(new Filter() { public boolean matches(Object o) { if (o instanceof Element) { Element e = (Element) o; if (e.getName().equals("classpathentry") && "lib".equals(e.getAttributeValue("kind"))) { return true; } } return false; } }); Iterator libElemIter = libElements.iterator(); while (libElemIter.hasNext()) { Element entryElem = (Element) libElemIter.next(); File projectBase = f.getParentFile(); String libPath = entryElem.getAttributeValue("path"); File libFile = new File(projectBase, libPath); String libName = libFile.getName(); if (libName.startsWith("caGrid-") && libName.endsWith("-1.6-dev.jar")) { System.out.println("Found a library to fix up (" + libPath + ")"); int endIndex = libPath.lastIndexOf("-1.6-dev.jar"); libPath = libPath.substring(0, endIndex); libPath += "-1.4.jar"; System.out.println("\tFixed up to " + libPath); entryElem.setAttribute("path", libPath); } } saveDocument(doc, f); } catch (Exception ex) { ex.printStackTrace(); } } } } public static void main(String[] args) { ClasspathFixer fixer = new ClasspathFixer("w:/Projects/cagrid/caGrid-1_4_release/Software/core"); fixer.startFixing(); } public static List<File> recursiveListFiles(File baseDir, final FileFilter filter) { FileFilter dirFilter = new FileFilter() { public boolean accept(File pathname) { return pathname.isDirectory() || filter.accept(pathname); } }; File[] fileArray = baseDir.listFiles(dirFilter); List<File> files = new ArrayList<File>(fileArray.length); for (int i = 0; i < fileArray.length; i++) { if (fileArray[i].isDirectory()) { files.addAll(recursiveListFiles(fileArray[i], filter)); } else { files.add(fileArray[i]); } } return files; } public static Document fileToDocument(File f) throws Exception { try { InputStream fis = new FileInputStream(f); SAXBuilder builder = new SAXBuilder(false); Document doc = builder.build(fis); fis.close(); return doc; } catch (Exception e) { throw new Exception("Document construction failed: " + e.getMessage(), e); } } public static void saveDocument(Document doc, File out) throws Exception { XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); FileWriter writer = new FileWriter(out); outputter.output(doc, writer); writer.close(); } }