/*
 * Copyright (c) 2003, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.jndi.ldap.obj;

import java.security.Principal;
import javax.naming.NamingException;
import com.sun.jndi.ldap.LdapName;

/**
 * A principal from the LDAP directory.
 *
 * @author Vincent Ryan
 */
class LdapPrincipal implements Principal {

    private LdapName ldapName = null;
    private int hash = -1;
    private String name;

    /**
     * Create a principal.
     *
     * @param name The principal's string name.
     */
    public LdapPrincipal(String name) {
        this.name = name;
    }


    /**
     * Compares this principal to the specified object.
     *
     * @param object The object to compare this principal against.
     * @return true if they are equal; false otherwise.
     */
    @Override
    public boolean equals(Object object) {
        if (ldapName == null) {
            ldapName = getLdapName(name);
        }
        // this is a broken equals implementation. It doesnot have any dependency on Glassfish code
        /*
         * if (object instanceof String) {
         * return ldapName.equals(getLdapName((String)object));
         * }
         */
        if (object instanceof Principal) {
            return ldapName.equals(getLdapName(((Principal) object).getName()));
        }
        return false;
    }


    /**
     * Returns a hash code for this principal.
     *
     * @return The principal's hash code.
     */
    @Override
    public int hashCode() {
        if (hash == -1) {
            if (ldapName == null) {
                ldapName = getLdapName(name);
            }
            hash = ldapName.hashCode();
        }
        return hash;
    }


    /**
     * Returns the name of this principal.
     *
     * @return String The principal's string name.
     */
    @Override
    public String getName() {
        return name;
    }


    /**
     * Returns a string representation of this principal.
     *
     * @return String The principal's string name.
     */
    @Override
    public String toString() {
        return name;
    }


    private LdapName getLdapName(String name) {
        LdapName ldapName = null;
        try {
            ldapName = new LdapName(name);
        } catch (NamingException e) {
            // ignore
        }
        return ldapName;
    }
}
