package org.jboss.resteasy.plugins.server.embedded;

import java.security.Principal;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

import org.jboss.resteasy.resteasy_jaxrs.i18n.Messages;

/**
 * POJO Security domain.
 *
 * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
 * @version $Revision: 1 $
 */
public class SimpleSecurityDomain implements SecurityDomain {
    private ConcurrentHashMap<String, String> users = new ConcurrentHashMap<String, String>();
    private ConcurrentHashMap<String, Set<String>> roles = new ConcurrentHashMap<String, Set<String>>();

    public void addRole(String user, String role) {
        Set<String> users = roles.get(role);
        if (users == null) {
            users = new CopyOnWriteArraySet<String>();
            roles.putIfAbsent(role, users);
            users = roles.get(role);
        }
        users.add(user);
    }

    public void addUser(String username, String password, String[] roles) {
        users.put(username, password);
        for (String role : roles)
            addRole(username, role);
    }

    public void addRoles(String role, String[] users) {
        for (String user : users)
            addRole(user, role);
    }

    public Principal authenticate(String username, String password) throws SecurityException {
        String passwd = users.get(username);
        if (passwd == null)
            throw new SecurityException(Messages.MESSAGES.userIsNotRegistered(username));
        if (!passwd.equals(password))
            throw new SecurityException(Messages.MESSAGES.wrongPassword(username));

        return new SimplePrincipal(username);
    }

    public boolean isUserInRole(Principal username, String role) {
        //System.out.println("Is user in role: " + username.getName() + " for role " + role);
        Set<String> users = roles.get(role);
        if (users == null) {
            //System.out.println("No user of that name");
            return false;
        }

        boolean result = users.contains(username.getName());
        //System.out.println("Result is: " + result);
        return result;
    }
}
