| ClassChecker |

    package  ij.plugin;
    import ij.*;
    import ij.util.*;
    import java.io.*;
    import java.util.*;

    /** Checks for duplicate class files in the plugins directory and deletes older duplicates. */
    public class ClassChecker implements PlugIn {

        char separatorChar = Prefs.separator.charAt(0);

        public void run(String arg) {
            deleteDuplicates();
        }

        void deleteDuplicates() {
            String[] paths = getClassFiles();
            if (paths==null)
                return;
            String name;
            File file1, file2;
            long date1, date2;
            for (int i=0; i<paths.length; i++) {
                name = getName(paths[i]);
                if (name.endsWith("classx"))
                    continue;
                for (int j=i+1; j<paths.length; j++) {
                    if (paths[j].endsWith(name)) {
                        file1 = new File(paths[i]);
                        file2 = new File(paths[j]);
                        if (file1==null || file2==null)
                            continue;
                        date1 = file1.lastModified();
                        date2 = file2.lastModified();
                        if (date1<date2) {
                            write(paths[i]);
                            file1.delete();
                            break;
                        } else if (date2<date1) {
                            write(paths[j]);
                            paths[j] += "x";
                            file2.delete();
                        } else {
                            if (paths[i].endsWith("plugins"+name)) {
                                write(paths[i]);
                                file1.delete();
                                break;
                            } else if (paths[j].endsWith("plugins"+name)) {
                                write(paths[j]);
                                paths[j] += "x";
                                file2.delete();
                            }
                        }
                    }
                }
            }
        }

        void write(String path) {
            IJ.log("Deleting duplicate class: "+path);
        }

        public String getName(String path) {
            int index = path.lastIndexOf(separatorChar);
            return (index < 0) ? path : path.substring(index);
        }

        /** Returns a list of all the class files in the plugins
             folder and subfolders of the plugins folder. */
        String[] getClassFiles() {
            String path = Menus.getPlugInsPath();
            if (path==null)
                return null;
            File f = new File(path);
            String[] list = f.list();
            if (list==null) return null;
            Vector v = new Vector();
            for (int i=0; i<list.length; i++) {
                String name = list[i];
                boolean isClassFile = name.endsWith(".class");
                if (isClassFile) {
                    //className = className.substring(0, className.length()-6);
                    v.addElement(path+name);
                } else {
                    if (!isClassFile)
                        getSubdirectoryClassFiles(path, name, v);
                }
            }
            list = new String[v.size()];
            v.copyInto((String[])list);
            return list;
        }

        /** Looks for class files in a subfolders of the plugins folder. */
        void getSubdirectoryClassFiles(String path, String dir, Vector v) {
            //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 = name.substring(0, name.length()-6); // remove ".class"
                    v.addElement(path+dir+name);
                    //IJ.write("File: "+f+"/"+name);
                }
            }
        }

    }

| ClassChecker |