alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.openide.loaders;

import java.util.*;
import org.openide.filesystems.FileObject;

import org.openide.util.Lookup;
import org.openide.nodes.Node;

/**
 * Compares objects in a folder.
 * @author Jaroslav Tulach, Jesse Glick
 */
class FolderComparator extends DataFolder.SortMode implements Comparator {
    /** modes */
    public static final int NONE = 0;
    public static final int NAMES = 1;
    public static final int CLASS = 2;
    /** first of all DataFolders, then other object, everything sorted
    * by names
    */
    public static final int FOLDER_NAMES = 3;
    /** by folders, then modification time */
    public static final int LAST_MODIFIED = 4;
    /** by folders, then size */
    public static final int SIZE = 5;


    /** mode to use */
    private int mode;

    /** New comparator. Sorts folders first and everything by names.
    */
    public FolderComparator () {
        this (FOLDER_NAMES);
    }

    /** New comparator.
    * @param mode one of sorting type constants
    */
    public FolderComparator (int mode) {
        this.mode = mode;
    }

    /** Comparing method. Can compare two DataObjects
    * or two Nodes (if they have data object cookie)
    */
    public int compare (Object o1, Object o2) {
        DataObject obj1;
        DataObject obj2;

        if (o1 instanceof Node) {
            obj1 = (DataObject)((Node)o1).getCookie (DataObject.class);
            obj2 = (DataObject)((Node)o2).getCookie (DataObject.class);
        } else {
            obj1 = (DataObject)o1;
            obj2 = (DataObject)o2;
        }

        switch (mode) {
        case NONE:
            return 0;
        case NAMES:
            return compareNames (obj1, obj2);
        case CLASS:
            return compareClass (obj1, obj2);
        case FOLDER_NAMES:
            return compareFoldersFirst (obj1, obj2);
        case LAST_MODIFIED:
            return compareLastModified(obj1, obj2);
        case SIZE:
            return compareSize(obj1, obj2);
        default:
            assert false : mode;
            return 0;
        }
    }


    /** for sorting data objects by names */
    private int compareNames (DataObject obj1, DataObject obj2) {
        // #35069 - use extension for sorting if displayname is same.
        //  Otherwise the order of files is random.
        int part = obj1.getName().compareTo(obj2.getName());
        return part != 0 ? part :
            obj1.getPrimaryFile().getExt().compareTo(obj2.getPrimaryFile().getExt());
    }

    /** for sorting folders first and then by names */
    private int compareFoldersFirst (DataObject obj1, DataObject obj2) {
        if (obj1.getClass () != obj2.getClass ()) {
            // if classes are different than the folder goes first
            if (obj1 instanceof DataFolder) {
                return -1;
            }
            if (obj2 instanceof DataFolder) {
                return 1;
            }
        }

        // otherwise compare by names
        return compareNames(obj1, obj2);
    }

    /** for sorting data objects by their classes */
    private int compareClass (DataObject obj1, DataObject obj2) {
        Class c1 = obj1.getClass ();
        Class c2 = obj2.getClass ();

        if (c1 == c2) {
            return compareNames(obj1, obj2);
        }

        // sort by classes
        DataLoaderPool dlp = DataLoaderPool.getDefault();
        final Enumeration loaders = dlp.allLoaders ();

        // PENDING, very very slow
        while (loaders.hasMoreElements ()) {
            Class clazz = ((DataLoader) (loaders.nextElement ())).getRepresentationClass ();

            // Sometimes people give generic DataObject as representation class.
            // It is not always avoidable: see e.g. org.netbeans.core.windows.layers.WSLoader.
            // In this case the overly flexible loader would "poison" sort-by-type, so we
            // make sure to ignore this.
            if (clazz == DataObject.class) continue;
            
            boolean r1 = clazz.isAssignableFrom (c1);
            boolean r2 = clazz.isAssignableFrom (c2);

            if (r1 && r2) return compareNames(obj1, obj2);
            if (r1) return -1;
            if (r2) return 1;
        }
        return compareNames(obj1, obj2);
    }

    /**
     * Sort folders alphabetically first. Then files, newest to oldest.
     */
    private static int compareLastModified(DataObject obj1, DataObject obj2) {
        if (obj1 instanceof DataFolder) {
            if (obj2 instanceof DataFolder) {
                return obj1.getName().compareTo(obj2.getName());
            } else {
                return -1;
            }
        } else {
            if (obj2 instanceof DataFolder) {
                return 1;
            } else {
                FileObject fo1 = obj1.getPrimaryFile();
                FileObject fo2 = obj2.getPrimaryFile();
                Date d1 = fo1.lastModified();
                Date d2 = fo2.lastModified();
                if (d1.after(d2)) {
                    return -1;
                } else if (d2.after(d1)) {
                    return 1;
                } else {
                    return fo1.getNameExt().compareTo(fo2.getNameExt());
                }
            }
        }
    }

    /**
     * Sort folders alphabetically first. Then files, biggest to smallest.
     */
    private static int compareSize(DataObject obj1, DataObject obj2) {
        if (obj1 instanceof DataFolder) {
            if (obj2 instanceof DataFolder) {
                return obj1.getName().compareTo(obj2.getName());
            } else {
                return -1;
            }
        } else {
            if (obj2 instanceof DataFolder) {
                return 1;
            } else {
                FileObject fo1 = obj1.getPrimaryFile();
                FileObject fo2 = obj2.getPrimaryFile();
                long s1 = fo1.getSize();
                long s2 = fo2.getSize();
                if (s1 > s2) {
                    return -1;
                } else if (s2 > s1) {
                    return 1;
                } else {
                    return fo1.getNameExt().compareTo(fo2.getNameExt());
                }
            }
        }
    }

}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.