gwtquery.plugins.droppable.client.gfindersample.FileSystem.java Source code

Java tutorial

Introduction

Here is the source code for gwtquery.plugins.droppable.client.gfindersample.FileSystem.java

Source

/*
 * Copyright 2010 The gwtquery plugins team.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package gwtquery.plugins.droppable.client.gfindersample;

import com.google.gwt.user.client.Random;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Class simulating the file system.
 * 
 * @author Julien Dramaix (julien.dramaix@gmail.com)
 * 
 */
public class FileSystem {

    /**
     * File object
     */
    public static class File implements Comparable<File> {

        /**
         * The key provider that provides the unique ID of a file.
         */
        public static final ProvidesKey<File> KEY_PROVIDER = new ProvidesKey<File>() {
            public Object getKey(File item) {
                return item == null ? null : item.getId();
            }
        };

        private static int nextId = 0;

        private final int id;
        private String name;
        private File parent;
        private FileType type;

        public File(FileType type) {
            this.type = type;
            this.id = nextId;
            nextId++;
        }

        public int compareTo(File o) {
            if (o == null) {
                return -1;
            }
            if (o.getType() != type) {
                return (type == FileType.DIRECTORY) ? 1 : -1;
            }
            return (o.name == null) ? -1 : -o.name.compareTo(name);
        }

        @Override
        public boolean equals(Object o) {
            if (o instanceof File) {
                return id == ((File) o).id;
            }
            return false;
        }

        /**
         * @return the unique ID of the file
         */
        public int getId() {
            return this.id;
        }

        /**
         * @return the file's address
         */
        public String getName() {
            return name;
        }

        /**
         * @return the parent directory or null if it is root
         */
        public File getParent() {
            return parent;
        }

        /**
         * @return the type of the file
         */
        public FileType getType() {
            return type;
        }

        @Override
        public int hashCode() {
            return id;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setParent(File parent) {
            this.parent = parent;
        }

    }

    /**
     * File type
     */
    public static enum FileType {
        DIRECTORY, FILE;
    }

    /**
     * The singleton instance.
     */
    private static FileSystem instance;

    private static int MAX_DIR_NBR = 10;
    private static int MAX_FILE_NBR = 15;
    private static final String ROOT_DIRECTORY = "Pictures";

    private static final String[] USER_DIRECTORY_NAME = { "Mary", "Patricia", "Linda", "Barbara", "Elizabeth",
            "Jennifer", "Maria", "Susan", "Margaret", "Dorothy", "Lisa", "Nancy", "Karen", "Betty", "Helen",
            "Sandra", "Donna", "Carol", "Ruth", "Sharon", "Michelle", "Laura", "Sarah", "Kimberly", "Deborah",
            "Jessica", "Shirley", "Cynthia", "Angela", "Melissa", "Brenda", "Amy", "Anna", "Rebecca", "Virginia",
            "Kathleen", "Pamela", "Martha", "Debra", "Amanda", "Stephanie", "Carolyn", "Christine", "Marie",
            "Janet", "Catherine", "Frances", "Ann", "Joyce", "Diane", "Alice", "Julie", "Heather", "Teresa",
            "Doris", "Gloria", "Evelyn", "Jean", "Cheryl", "Mildred", "Katherine", "Joan", "Ashley", "Judith",
            "Rose", "Janice", "Kelly", "Nicole", "Judy", "Christina", "Kathy", "Theresa", "Beverly", "Denise",
            "Tammy", "Irene", "Jane", "Lori", "Rachel", "Marilyn", "Andrea", "Kathryn", "Louise", "Sara", "Anne",
            "Jacqueline", "Wanda", "Bonnie", "Julia", "Ruby", "Lois", "Tina", "Phyllis", "Norma", "Paula", "Diana",
            "Annie", "Lillian", "Emily", "Robin", "Peggy", "Crystal", "Gladys", "Rita", "Dawn", "Connie",
            "Florence", "Tracy", "Edna", "Tiffany", "Carmen", "Rosa", "Cindy", "Grace", "Wendy", "Victoria",
            "Edith", "Kim", "Sherry", "Sylvia", "Josephine", "Thelma", "Shannon", "Sheila", "Ethel", "Ellen",
            "Elaine", "Marjorie", "Carrie", "Charlotte", "Monica", "Esther", "Pauline", "Emma", "Juanita", "Anita",
            "Rhonda", "Hazel", "Amber", "Eva", "Debbie", "April", "Leslie", "Clara", "Lucille", "Jamie", "Joanne",
            "Eleanor", "Valerie", "Danielle", "Megan", "Alicia", "Suzanne", "Michele", "Gail", "Bertha", "Darlene",
            "Veronica", "Jill", "Erin", "Geraldine", "Lauren", "Cathy", "Joann", "Lorraine", "Lynn", "Sally",
            "Regina", "Erica", "Beatrice", "Dolores", "Bernice", "Audrey", "Yvonne", "Annette", "June", "Samantha",
            "Marion", "Dana", "Stacy", "Ana", "Renee", "Ida", "Vivian", "Roberta", "Holly", "Brittany", "Melanie",
            "Loretta", "Yolanda", "Jeanette", "Laurie", "Katie", "Kristen", "Vanessa", "Alma", "Sue", "Elsie",
            "Beth", "Jeanne", "James", "John", "Robert", "Michael", "William", "David", "Richard", "Charles",
            "Joseph", "Thomas", "Christopher", "Daniel", "Paul", "Mark", "Donald", "George", "Kenneth", "Steven",
            "Edward", "Brian", "Ronald", "Anthony", "Kevin", "Jason", "Matthew", "Gary", "Timothy", "Jose", "Larry",
            "Jeffrey", "Frank", "Scott", "Eric", "Stephen", "Andrew", "Raymond", "Gregory", "Joshua", "Jerry",
            "Dennis", "Walter", "Patrick", "Peter", "Harold", "Douglas", "Henry", "Carl", "Arthur", "Ryan", "Roger",
            "Joe", "Juan", "Jack", "Albert", "Jonathan", "Justin", "Terry", "Gerald", "Keith", "Samuel", "Willie",
            "Ralph", "Lawrence", "Nicholas", "Roy", "Benjamin", "Bruce", "Brandon", "Adam", "Harry", "Fred",
            "Wayne", "Billy", "Steve", "Louis", "Jeremy", "Aaron", "Randy", "Howard", "Eugene", "Carlos", "Russell",
            "Bobby", "Victor", "Martin", "Ernest", "Phillip", "Todd", "Jesse", "Craig", "Alan", "Shawn", "Clarence",
            "Sean", "Philip", "Chris", "Johnny", "Earl", "Jimmy", "Antonio", "Danny", "Bryan", "Tony", "Luis",
            "Mike", "Stanley", "Leonard", "Nathan", "Dale", "Manuel", "Rodney", "Curtis", "Norman", "Allen",
            "Marvin", "Vincent", "Glenn", "Jeffery", "Travis", "Jeff", "Chad", "Jacob", "Lee", "Melvin", "Alfred",
            "Kyle", "Francis", "Bradley", "Jesus", "Herbert", "Frederick", "Ray", "Joel", "Edwin", "Don", "Eddie",
            "Ricky", "Troy", "Randall", "Barry", "Alexander", "Bernard", "Mario", "Leroy", "Francisco", "Marcus",
            "Micheal", "Theodore", "Clifford", "Miguel", "Oscar", "Jay", "Jim", "Tom", "Calvin", "Alex", "Jon",
            "Ronnie", "Bill", "Lloyd", "Tommy", "Leon", "Derek", "Warren", "Darrell", "Jerome", "Floyd", "Leo",
            "Alvin", "Tim", "Wesley", "Gordon", "Dean", "Greg", "Jorge", "Dustin", "Pedro", "Derrick", "Dan",
            "Lewis", "Zachary", "Corey", "Herman", "Maurice", "Vernon", "Roberto", "Clyde", "Glen", "Hector",
            "Shane", "Ricardo", "Sam", "Rick", "Lester", "Brent", "Ramon", "Charlie", "Tyler", "Gilbert", "Gene" };

    /**
     * Get the singleton instance.
     * 
     * @return the singleton instance
     */
    public static FileSystem get() {
        if (instance == null) {
            instance = new FileSystem();
        }
        return instance;
    }

    /**
     * The provider that holds the list of files in a directory.
     */
    private Map<File, ListDataProvider<File>> filesByDirectory = new HashMap<File, ListDataProvider<File>>();
    private ListDataProvider<File> rootDirectories = new ListDataProvider<File>();

    /**
     * Construct the file system.
     */
    private FileSystem() {

        File rootDirectory = new File(FileType.DIRECTORY);
        rootDirectory.setName(ROOT_DIRECTORY);

        generateDirTree(rootDirectory);

        rootDirectories.getList().add(rootDirectory);

    }

    /**
     * Return the RootDirectories
     * @return
     */
    public ListDataProvider<File> getRootDirectories() {
        return rootDirectories;

    }

    /**
     * List the files in the directory <code>dir</code>
     * 
     * @param dir
     * 
     */
    public ListDataProvider<File> ls(File dir) {
        return filesByDirectory.get(dir);
    }

    /**
     * Move the file <code>file</code> to the directory <code>destination</code>
     * 
     */
    public void moveFile(File file, File destination) {
        assert destination.getType() == FileType.DIRECTORY;

        File oldDestination = file.getParent();
        List<File> previousList = ls(oldDestination).getList();
        List<File> newList = ls(destination).getList();

        previousList.remove(file);
        newList.add(file);

        file.setParent(destination);
    }

    /**
     * Generate contents for the directory <code>root</code>
     * 
     * @param root
     * @param fileNbr
     * @param subDirNbr
     */
    private void generateDirContent(File root, int fileNbr, int subDirNbr) {

        assert root.getType() == FileType.DIRECTORY;

        ListDataProvider<File> files = new ListDataProvider<File>();

        for (int i = 0; i < subDirNbr; i++) {
            File f = new File(FileType.DIRECTORY);
            f.setName(root.getName() + "Event" + i);
            f.setParent(root);
            files.getList().add(f);

            generateDirContent(f, Math.max(5, Random.nextInt(MAX_FILE_NBR)), 0);
        }

        for (int i = 0; i < fileNbr; i++) {
            File f = new File(FileType.FILE);
            f.setName(root.getName() + "PICT" + i + ".jpg");
            f.setParent(root);
            files.getList().add(f);
        }

        filesByDirectory.put(root, files);

    }

    /**
     * Generate the file system
     * 
     * @param rootDirectory
     */
    private void generateDirTree(File rootDirectory) {
        // generate user directories
        ListDataProvider<File> files = new ListDataProvider<File>();

        for (int i = 0; i < Math.max(10, Random.nextInt(20)); i++) {
            File f = new File(FileType.DIRECTORY);
            f.setName(nextValue(USER_DIRECTORY_NAME));
            f.setParent(rootDirectory);
            files.getList().add(f);
            // generate Event sub directories
            generateDirContent(f, 0, Math.max(5, Random.nextInt(MAX_DIR_NBR)));

        }
        filesByDirectory.put(rootDirectory, files);

    }

    /**
     * Get the next random value from an array.
     * 
     * @param array
     *          the array
     * @return a random value in the array
     */
    private <T> T nextValue(T[] array) {
        return array[Random.nextInt(array.length)];
    }

}