package ij.plugin; import ij.*; import ij.util.*; import java.io.*; import java.util.*; /** Checks for duplicate class and JAR files in the plugins folders and deletes older duplicates. */ public class ClassChecker implements PlugIn { String[] paths; String[] names; public void run(String arg) { //long start = System.currentTimeMillis(); deleteDuplicates(); //IJ.log("Time: "+(System.currentTimeMillis()-start)); } void deleteDuplicates() { getPathsAndNames(); if (paths==null || paths.length<2) return; String[] sortedNames = new String[names.length]; for (int i=0; i<names.length; i++) sortedNames[i] = names[i]; StringSorter.sort(sortedNames); for (int i=0; i<sortedNames.length-1; i++) { if (sortedNames[i].equals(sortedNames[i+1])) delete(sortedNames[i]); } } void delete(String name) { String path1=null, path2=null; File file1, file2; long date1, date2; for (int i=0; i<names.length; i++) { if (path1==null && names[i].equals(name)) { path1 = paths[i] +names[i]; //IJ.log("path1: "+i+" "+name+" "+path1+" "+paths[i]+" "+names[i]); } else if (path2==null && names[i].equals(name)) { path2 = paths[i] +names[i]; //IJ.log("path2: "+i+" "+name+" "+path2+" "+paths[i]+" "+names[i]); } if (path1!=null && path2!=null) { file1 = new File(path1); file2 = new File(path2); if (file1==null || file2==null) return; date1 = file1.lastModified(); date2 = file2.lastModified(); if (date1<date2) { write(path1); file1.delete(); } else { write(path2); file2.delete(); } break; } } } void write(String path) { IJ.log("Deleting duplicate plugin: "+path); } /** Gets lists of all the class and jar files in the plugins folder and subfolders of the plugins folder. */ void getPathsAndNames() { String path = Menus.getPlugInsPath(); if (path==null) return; File f = new File(path); String[] list = f.list(); if (list==null) return; Vector v1 = new Vector(1000); Vector v2 = new Vector(1000); for (int i=0; i<list.length; i++) { String name = list[i]; if (name.endsWith(".class") || name.endsWith(".jar")) { v1.addElement(path); v2.addElement(name); } else getSubdirectoryFiles(path, name, v1, v2); } paths = new String[v1.size()]; v1.copyInto((String[])paths); names = new String[v2.size()]; v2.copyInto((String[])names); } /** Looks for class and jar files in a subfolders of the plugins folder. */ void getSubdirectoryFiles(String path, String dir, Vector v1, Vector v2) { //IJ.write("getSubdirectoryClassFiles: "+path+dir); if (dir.endsWith(".java")) return; File f = new File(path, dir); if (!f.isDirectory()) return; String[] list = f.list(); if (list==null) return; dir += Prefs.separator; for (int i=0; i<list.length; i++) { String name = list[i]; if (name.endsWith(".class") || name.endsWith(".jar")) { v1.addElement(path+dir); v2.addElement(name); } } } }