All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.milton.http.annotated.ResourceList Maven / Gradle / Ivy

Go to download

Milton Community Edition: Supports DAV level 1 and is available on Apache2 license

The newest version!
/*
 *
 * Copyright 2014 McEvoy Software Ltd.
 *
 * 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 io.milton.http.annotated;

import io.milton.resource.CollectionResource;
import io.milton.resource.Resource;

import java.util.*;

/**
 * @author brad
 */
public class ResourceList extends ArrayList {

    private static final long serialVersionUID = 1L;
    private final Map map = new HashMap<>();

    public ResourceList() {
    }

    public ResourceList(AnnoResource[] array) {
        addAll(Arrays.asList(array));
    }

    public ResourceList(ResourceList copyFrom) {
        super(copyFrom);
    }

    public ResourceList getDirs() {
        ResourceList list = new ResourceList();
        for (CommonResource cr : this) {
            if (cr instanceof CollectionResource) {
                list.add(cr);
            }
        }
        return list;
    }

    public ResourceList getFiles() {
        ResourceList list = new ResourceList();
        for (CommonResource cr : this) {
            if (!(cr instanceof CollectionResource)) {
                list.add(cr);
            }
        }
        return list;
    }

    @Override
    public boolean add(CommonResource e) {
        if (e == null) {
            throw new NullPointerException("Attempt to add null node");
        }
        if (e.getName() == null) {
            throw new NullPointerException("Attempt to add resource with null name: " + e.getClass().getName());
        }
        map.put(e.getName(), e);
        return super.add(e);
    }

    /**
     * Just adds the elements in the given list to this list and returns list to
     * make it suitable for chaining and use from velocity
     *
     * @param otherList
     * @return
     */
    public ResourceList add(ResourceList otherList) {
        addAll(otherList);
        return this;
    }

    public CommonResource get(String name) {
        return map.get(name);
    }

    public Resource remove(String name) {
        CommonResource r = map.remove(name);
        if (r != null) {
            super.remove(r);
        }
        return r;
    }

    public boolean hasChild(String name) {
        return get(name) != null;
    }

    @Override
    public boolean remove(Object o) {
        if (o instanceof Resource) {
            Resource e = (Resource) o;
            map.remove(e.getName());
        }
        return super.remove(o);
    }

    public Resource getFirst() {
        if (isEmpty()) {
            return null;
        }
        return this.get(0);
    }

    public Resource getLast() {
        if (this.size() > 0) {
            return this.get(this.size() - 1);
        } else {
            return null;
        }
    }

    public Resource getRandom() {
        int l = this.size();
        if (l == 0) {
            return null;
        }

        List list = new ArrayList<>();
        list.addAll(this);
        if (list.isEmpty()) {
            return null;
        }

        Random rnd = new Random();
        int pos = rnd.nextInt(list.size());
        return list.get(pos);
    }

    public ResourceList getReverse() {
        ResourceList list = new ResourceList(this);
        Collections.reverse(list);
        return list;
    }

    public ResourceList getSortByModifiedDate() {
        ResourceList list = new ResourceList(this);
        list.sort((Comparator) (o1, o2) -> {
            Date dt1 = o1.getModifiedDate();
            Date dt2 = o2.getModifiedDate();
            if (dt1 == null) {
                return -1;
            }
            return -1 * dt1.compareTo(dt2);
        });
        return list;
    }

    public ResourceList getSortByName() {
        ResourceList list = new ResourceList(this);
        list.sort((Comparator) (o1, o2) -> {
            String n1 = o1.getName();
            String n2 = o2.getName();
            return n1.compareTo(n2);
        });
        return list;
    }

    public ResourceList getRandomSort() {
        AnnoResource[] array = new AnnoResource[this.size()];
        this.toArray(array);

        Random rng = new Random();   // i.e., java.util.Random.
        int n = array.length;        // The number of items left to shuffle (loop invariant).
        while (n > 1) {
            int k = rng.nextInt(n);  // 0 <= k < n.
            n--;                     // n is now the last pertinent index;
            AnnoResource temp = array[n];     // swap array[n] with array[k] (does nothing if k == n).
            array[n] = array[k];
            array[k] = temp;
        }
        return new ResourceList(array);
    }

    public ResourceList exclude(String s) {
        return _exclude(s);
    }

    public ResourceList exclude(String s1, String s2) {
        return _exclude(s1, s2);
    }

    public ResourceList exclude(String s1, String s2, String s3) {
        return _exclude(s1, s2, s3);
    }

    public ResourceList exclude(String s1, String s2, String s3, String s4) {
        return _exclude(s1, s2, s3, s4);
    }

    public ResourceList _exclude(String... s) {
        ResourceList newList = new ResourceList(this);
        newList.removeIf(ct -> contains(s, ct.getName()));
        return newList;
    }

    private boolean contains(String[] arr, String name) {
        for (String s : arr) {
            if (name.equals(s)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Returns a new list where elements satisfy is(s)
     *
     * @param s
     * @return
     */
    public ResourceList ofType(String s) {
        ResourceList newList = new ResourceList(this);
        newList.removeIf(ct -> !ct.is(s));
        return newList;
    }

    /**
     * Return a new list with a size no greater then the given argument
     *
     * @param maxSize - the maximum number of elements in the new list
     * @return
     */
    public ResourceList truncate(int maxSize) {
        ResourceList list = new ResourceList();
        for (int i = 0; i < maxSize && i < size(); i++) {
            list.add(get(i));
        }
        return list;
    }

    public Map getOfType() {
        return new ChildrenOfTypeMap(this);
    }

    /**
     * Returns the next item after the one given. If the given argument is null,
     * returns the first item in the list
     *
     * @param from
     * @return
     */
    public Resource next(Resource from) {
        if (from == null) {
            return getFirst();
        } else {
            boolean found = false;
            for (Resource r : this) {
                if (found) {
                    return r;
                }
                if (r == from) {
                    found = true;
                }
            }
            return null;
        }
    }

    public ResourceList closest(String type) {
        ResourceList l = new ResourceList();
        for (CommonResource r : this) {
            while (r != null) {
                if (r.is(type)) {
                    l.add(r);
                    break;
                }
                r = r.getParent();
            }
        }
        return l;
    }


    public Map getMap() {
        return map;
    }


//	public ResourceList find(String path, String type) {
//		ResourceList l = new ResourceList();
//		for( CommonResource r : this) {
//			if( r.is(type)) {
//				l.add(r);
//			}
//		}
//		return l;
//	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy