/*
 * Created on 10-Feb-2005
 */
package org.bodington.servlet.facilities;

import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;

import org.bodington.server.realm.AclEntry;
import org.bodington.server.realm.Permission;
import org.bodington.server.realm.User;


abstract public class AclResourcePermission implements Comparable {
   
    private HashSet permissions = new HashSet();

    abstract public User getUser();
    abstract public Iterator getGroups();
    
    public void addPermission(Permission permission) {
        permissions.add(permission);
    }
    
    public boolean hasPermission(Permission permission) {
        return permissions.contains(permission);
    }
    
    public void addPermissions(AclEntry entry)
    {
        Enumeration permissions = entry.permissions();
        while(permissions.hasMoreElements())
        {
            addPermission((Permission)permissions.nextElement());
        }
    }
    
    public void addPermissions(AclResourcePermission aclPermission)
    {
        Enumeration permissions = Permission.permissions();
        while (permissions.hasMoreElements())
        {
            Permission permission = (Permission)permissions.nextElement();
            if (aclPermission.hasPermission(permission))
            {
                addPermission(permission);
            }
        }
    }
    
    public void addAdminPermissions(AclEntry entry)
    {
        if (entry.checkPermission(Permission.ADMINISTER))
            addPermission(Permission.ADMINISTER);
        if (entry.checkPermission(Permission.SYSADMIN))
            addPermission(Permission.SYSADMIN);
    }
    
    
    /**
     * Compare to another AclResourcePermission. This is used as the
     * fallback for comparing objects of different types when sorting in child classes.
     * At the moment it puts AclUserResourcePermission objects before all others.
     * @param other The class we are comparing against.
     * @return 1 If other is a AclUserResourcePermission.
     */
    public int compareTo(AclResourcePermission other)
    {
        if(other instanceof AclUserResourcePermission)
        {
            return -1;
        }
        else
        {
            return 1;
        }
    }

    
    
}