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

org.apache.fulcrum.security.util.SecuritySet Maven / Gradle / Ivy

There is a newer version: 3.0.0
Show newest version
package org.apache.fulcrum.security.util;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import org.apache.commons.lang.StringUtils;
import org.apache.fulcrum.security.entity.SecurityEntity;

/**
 * This class represents a set of Security Entities. It makes it easy to build a
 * UI. It wraps a TreeSet object to enforce that only relevant methods are
 * available. TreeSet's contain only unique Objects (no duplicates) based on the
 * ID. They may or may not have a name, that depends on the implementation. Want
 * to get away from requiring an ID and a name... Nothing should force Name to be
 * unique in the basic architecture of Fulcrum Security.
 *
 * @author Eric Pugh
 * @author John D. McNally
 * @author Brett McLaughlin
 * @author Marco Knüttel
 * @author Henning P. Schmiedehausen
 * @version $Id: SecuritySet.java 1754545 2016-07-29 16:08:15Z tv $
 */
public abstract class SecuritySet implements Serializable, Set, Iterable
{
    /** Serial version */
    private static final long serialVersionUID = 2251987059226422569L;

    /** Map for "name" -> "security object" */
    protected Map nameMap = null;
    /** Map for "id" -> "security object" */
    protected Map idMap = null;

    /**
     * Constructs an empty Set
     */
    public SecuritySet()
    {
        nameMap = new TreeMap(String.CASE_INSENSITIVE_ORDER);
        idMap = new TreeMap();
    }

    /**
     * Returns a set of security objects in this object.
     *
     * @return A Set Object
     *
     */
    public Set getSet()
    {
        return new HashSet(idMap.values());
    }

    /**
     * Returns a set of Names in this Object.
     *
     * @return The Set of Names in this Object, backed by the actual data.
     */
    public Set getNames()
    {
        return nameMap.keySet();
    }

    /**
     * Returns a set of Id values in this Object.
     *
     * @return The Set of Ids in this Object, backed by the actual data.
     */
    public Set getIds()
    {
        return idMap.keySet();
    }

    /**
     * Removes all Objects from this Set.
     */
    @Override
    public void clear()
    {
        nameMap.clear();
        idMap.clear();
    }

    /**
     * Searches if an Object with a given name is in the Set
     *
     * @param roleName
     *            Name of the Security Object.
     * @return True if argument matched an Object in this Set; false if no
     *         match.
     */
    public boolean containsName(String name)
    {
        return (StringUtils.isNotEmpty(name)) ? nameMap.containsKey(name) : false;
    }

    /**
     * Searches if an Object with a given Id is in the Set
     *
     * @param id
     *            Id of the Security Object.
     * @return True if argument matched an Object in this Set; false if no
     *         match.
     */
    public boolean containsId(Object id)
    {
        return (id == null) ? false : idMap.containsKey(id);
    }

    /**
     * Returns an Iterator for Objects in this Set.
     *
     * @return An iterator for the Set
     */
    @Override
    public Iterator iterator()
    {
        return idMap.values().iterator();
    }

    /**
     * Returns size (cardinality) of this set.
     *
     * @return The cardinality of this Set.
     */
    @Override
    public int size()
    {
        return idMap.size();
    }

    /**
     * list of role names in this set
     *
     * @return The string representation of this Set.
     */
    @Override
    public String toString()
    {
        StringBuffer sbuf = new StringBuffer(12 * size());

        for (Iterator it = iterator(); it.hasNext();)
        {
            T se = it.next();
            sbuf.append('[');
            sbuf.append(se.getName());
            sbuf.append(" -> ");
            sbuf.append(se.getId());
            sbuf.append(']');
            if (it.hasNext())
            {
                sbuf.append(", ");
            }
        }

        return sbuf.toString();
    }

    // methods from Set
    /**
     * @see java.util.Collection#add(java.lang.Object)
     */
    @Override
    public boolean add(T o)
    {
        if (contains(o))
        {
            return false;
        }

        if (o.getId() != null)
        {
            idMap.put(o.getId(), o);
        }
        if (o.getName() != null)
        {
            nameMap.put(o.getName(), o);
        }

        return true;
    }

    /**
     * Adds the entities in a Collection to this SecuritySet.
     *
     * @param collection
     *            A Collection of entities.
     * @return True if this Set changed as a result; false if no change to this
     *         Set occurred (this Set already contained all members of the added
     *         Set).
     */
    public boolean add(Collection collection)
    {
        return addAll(collection);
    }

    @Override
    public boolean addAll(Collection collection)
    {
        boolean res = false;

        for (T o : collection)
        {
            res |= add(o);
        }

        return res;
    }

    @Override
    public boolean isEmpty()
    {
        return idMap.isEmpty();
    }

    @Override
    public boolean containsAll(Collection collection)
    {
        for (Object object : collection)
        {
            if (!contains(object))
            {
                return false;
            }
        }
        return true;
    }

    @Override
    public boolean removeAll(Collection collection)
    {
        boolean changed = false;
        for (Object object : collection)
        {
            boolean result = remove(object);
            if (result)
            {
                changed = true;
            }
        }

        return changed;
    }

    @Override
    public boolean retainAll(Collection collection)
    {
        throw new RuntimeException("not implemented");
    }

    /*
     * (non-Javadoc)
     *
     * @see java.util.Collection#toArray()
     */
    @Override
    public Object[] toArray()
    {
        return getSet().toArray();
    }

    /**
     * Checks whether this SecuritySet contains an entity.
     *
     * @param o
     *            An entity.
     * @return True if this Set contains the entity, false otherwise.
     */
    @Override
    public boolean contains(Object o)
    {
        if (o == null || !(o instanceof SecurityEntity))
        {
            return false;
        }
        else
        {
            return containsId(((SecurityEntity) o).getId());
        }
    }

    /**
     * Removes an entity from this SecuritySet.
     *
     * @param o
     *            An entity.
     * @return True if this Set contained the entity before it was removed.
     */
    @Override
    public boolean remove(Object o)
    {
        if (o instanceof SecurityEntity)
        {
            boolean res = contains(o);
            idMap.remove(((SecurityEntity) o).getId());
            nameMap.remove(((SecurityEntity) o).getName());
            return res;
        }

        return false;
    }

    /**
     * @see java.util.Set#toArray(T[])
     */
    @Override
    public  A[] toArray(A[] a)
    {
        return getSet().toArray(a);
    }

    /**
     * Returns an entity with the given name, if it is contained in this
     * SecuritySet.
     *
     * @param name
     *            Name of entity.
     * @return entity if argument matched an entity in this Set; null if no
     *         match.
     */
    public T getByName(String name)
    {
        return nameMap.get(name);
    }

    /**
     * Returns an entity with the given id, if it is contained in this
     * SecuritySet.
     *
     * @param id
     *            ID of entity.
     * @return entity if argument matched an entity in this Set; null if no
     *         match.
     */
    public T getById(Object id)
    {
        return idMap.get(id);
    }
}