package org.bouncycastle.jce;

import org.bouncycastle.x509.X509StoreParameters;

import java.security.cert.CertStoreParameters;
import java.security.cert.LDAPCertStoreParameters;

/**
 * An expanded set of parameters for an LDAPCertStore
 */
public class X509LDAPCertStoreParameters
    implements X509StoreParameters, CertStoreParameters
{

    private String ldapURL;

    private String baseDN;

    // LDAP attributes, where data is stored

    private String userCertificateAttribute;

    private String cACertificateAttribute;

    private String crossCertificateAttribute;

    private String certificateRevocationListAttribute;

    private String deltaRevocationListAttribute;

    private String authorityRevocationListAttribute;

    private String attributeCertificateAttributeAttribute;

    private String aACertificateAttribute;

    private String attributeDescriptorCertificateAttribute;

    private String attributeCertificateRevocationListAttribute;

    private String attributeAuthorityRevocationListAttribute;

    // LDAP attributes with which data can be found

    private String ldapUserCertificateAttributeName;

    private String ldapCACertificateAttributeName;

    private String ldapCrossCertificateAttributeName;

    private String ldapCertificateRevocationListAttributeName;

    private String ldapDeltaRevocationListAttributeName;

    private String ldapAuthorityRevocationListAttributeName;

    private String ldapAttributeCertificateAttributeAttributeName;

    private String ldapAACertificateAttributeName;

    private String ldapAttributeDescriptorCertificateAttributeName;

    private String ldapAttributeCertificateRevocationListAttributeName;

    private String ldapAttributeAuthorityRevocationListAttributeName;

    // certificates and CRLs subject or issuer DN attributes, which must be
    // matched against ldap attribute names

    private String userCertificateSubjectAttributeName;

    private String cACertificateSubjectAttributeName;

    private String crossCertificateSubjectAttributeName;

    private String certificateRevocationListIssuerAttributeName;

    private String deltaRevocationListIssuerAttributeName;

    private String authorityRevocationListIssuerAttributeName;

    private String attributeCertificateAttributeSubjectAttributeName;

    private String aACertificateSubjectAttributeName;

    private String attributeDescriptorCertificateSubjectAttributeName;

    private String attributeCertificateRevocationListIssuerAttributeName;

    private String attributeAuthorityRevocationListIssuerAttributeName;

    private String searchForSerialNumberIn;

    public static class Builder
    {
        private String ldapURL;

        private String baseDN;

        // LDAP attributes, where data is stored

        private String userCertificateAttribute;

        private String cACertificateAttribute;

        private String crossCertificateAttribute;

        private String certificateRevocationListAttribute;

        private String deltaRevocationListAttribute;

        private String authorityRevocationListAttribute;

        private String attributeCertificateAttributeAttribute;

        private String aACertificateAttribute;

        private String attributeDescriptorCertificateAttribute;

        private String attributeCertificateRevocationListAttribute;

        private String attributeAuthorityRevocationListAttribute;

        // LDAP attributes with which data can be found

        private String ldapUserCertificateAttributeName;

        private String ldapCACertificateAttributeName;

        private String ldapCrossCertificateAttributeName;

        private String ldapCertificateRevocationListAttributeName;

        private String ldapDeltaRevocationListAttributeName;

        private String ldapAuthorityRevocationListAttributeName;

        private String ldapAttributeCertificateAttributeAttributeName;

        private String ldapAACertificateAttributeName;

        private String ldapAttributeDescriptorCertificateAttributeName;

        private String ldapAttributeCertificateRevocationListAttributeName;

        private String ldapAttributeAuthorityRevocationListAttributeName;

        // certificates and CRLs subject or issuer DN attributes, which must be
        // matched against ldap attribute names

        private String userCertificateSubjectAttributeName;

        private String cACertificateSubjectAttributeName;

        private String crossCertificateSubjectAttributeName;

        private String certificateRevocationListIssuerAttributeName;

        private String deltaRevocationListIssuerAttributeName;

        private String authorityRevocationListIssuerAttributeName;

        private String attributeCertificateAttributeSubjectAttributeName;

        private String aACertificateSubjectAttributeName;

        private String attributeDescriptorCertificateSubjectAttributeName;

        private String attributeCertificateRevocationListIssuerAttributeName;

        private String attributeAuthorityRevocationListIssuerAttributeName;

        private String searchForSerialNumberIn;

        public Builder()
        {
            this("ldap://localhost:389", "");
        }

        public Builder(String ldapURL, String baseDN)
        {
            this.ldapURL = ldapURL;
            if (baseDN == null)
            {
                this.baseDN = "";
            }
            else
            {
                this.baseDN = baseDN;
            }

            this.userCertificateAttribute = "userCertificate";
            this.cACertificateAttribute = "cACertificate";
            this.crossCertificateAttribute = "crossCertificatePair";
            this.certificateRevocationListAttribute = "certificateRevocationList";
            this.deltaRevocationListAttribute = "deltaRevocationList";
            this.authorityRevocationListAttribute = "authorityRevocationList";
            this.attributeCertificateAttributeAttribute = "attributeCertificateAttribute";
            this.aACertificateAttribute = "aACertificate";
            this.attributeDescriptorCertificateAttribute = "attributeDescriptorCertificate";
            this.attributeCertificateRevocationListAttribute = "attributeCertificateRevocationList";
            this.attributeAuthorityRevocationListAttribute = "attributeAuthorityRevocationList";
            this.ldapUserCertificateAttributeName = "cn";
            this.ldapCACertificateAttributeName = "cn ou o";
            this.ldapCrossCertificateAttributeName = "cn ou o";
            this.ldapCertificateRevocationListAttributeName = "cn ou o";
            this.ldapDeltaRevocationListAttributeName = "cn ou o";
            this.ldapAuthorityRevocationListAttributeName = "cn ou o";
            this.ldapAttributeCertificateAttributeAttributeName = "cn";
            this.ldapAACertificateAttributeName = "cn o ou";
            this.ldapAttributeDescriptorCertificateAttributeName = "cn o ou";
            this.ldapAttributeCertificateRevocationListAttributeName = "cn o ou";
            this.ldapAttributeAuthorityRevocationListAttributeName = "cn o ou";
            this.userCertificateSubjectAttributeName = "cn";
            this.cACertificateSubjectAttributeName = "o ou";
            this.crossCertificateSubjectAttributeName = "o ou";
            this.certificateRevocationListIssuerAttributeName = "o ou";
            this.deltaRevocationListIssuerAttributeName = "o ou";
            this.authorityRevocationListIssuerAttributeName = "o ou";
            this.attributeCertificateAttributeSubjectAttributeName = "cn";
            this.aACertificateSubjectAttributeName = "o ou";
            this.attributeDescriptorCertificateSubjectAttributeName = "o ou";
            this.attributeCertificateRevocationListIssuerAttributeName = "o ou";
            this.attributeAuthorityRevocationListIssuerAttributeName = "o ou";
            this.searchForSerialNumberIn = "uid serialNumber cn";
        }

        /**
         * @param userCertificateAttribute       Attribute name(s) in the LDAP directory where end certificates
         *                                       are stored. Separated by space. Defaults to "userCertificate"
         *                                       if <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setUserCertificateAttribute(String userCertificateAttribute)
        {
            this.userCertificateAttribute = userCertificateAttribute;

            return this;
        }

        /**
         * @param cACertificateAttribute         Attribute name(s) in the LDAP directory where CA certificates
         *                                       are stored. Separated by space. Defaults to "cACertificate" if
         *                                       <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setCACertificateAttribute(String cACertificateAttribute)
        {
            this.cACertificateAttribute = cACertificateAttribute;

            return this;
        }

        /**
         * @param crossCertificateAttribute      Attribute name(s), where the cross certificates are stored.
         *                                       Separated by space. Defaults to "crossCertificatePair" if
         *                                       <code>null</code>
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setCrossCertificateAttribute(String crossCertificateAttribute)
        {
            this.crossCertificateAttribute = crossCertificateAttribute;

            return this;
        }

        /**
         * @param certificateRevocationListAttribute
         *                                       Attribute name(s) in the LDAP directory where CRLs are stored.
         *                                       Separated by space. Defaults to "certificateRevocationList" if
         *                                       <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setCertificateRevocationListAttribute(String certificateRevocationListAttribute)
        {
            this.certificateRevocationListAttribute = certificateRevocationListAttribute;

            return this;
        }

        /**
         * @param deltaRevocationListAttribute   Attribute name(s) in the LDAP directory where delta RLs are
         *                                       stored. Separated by space. Defaults to "deltaRevocationList"
         *                                       if <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setDeltaRevocationListAttribute(String deltaRevocationListAttribute)
        {
            this.deltaRevocationListAttribute = deltaRevocationListAttribute;

            return this;
        }

        /**
         * @param authorityRevocationListAttribute
         *                                       Attribute name(s) in the LDAP directory where CRLs for
         *                                       authorities are stored. Separated by space. Defaults to
         *                                       "authorityRevocationList" if <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAuthorityRevocationListAttribute(String authorityRevocationListAttribute)
        {
            this.authorityRevocationListAttribute = authorityRevocationListAttribute;

            return this;
        }

        /**
         * @param attributeCertificateAttributeAttribute
         *                                       Attribute name(s) in the LDAP directory where end attribute
         *                                       certificates are stored. Separated by space. Defaults to
         *                                       "attributeCertificateAttribute" if <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeCertificateAttributeAttribute(String attributeCertificateAttributeAttribute)
        {
            this.attributeCertificateAttributeAttribute = attributeCertificateAttributeAttribute;

            return this;
        }

        /**
         * @param aACertificateAttribute         Attribute name(s) in the LDAP directory where attribute
         *                                       certificates for attribute authorities are stored. Separated
         *                                       by space. Defaults to "aACertificate" if <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAACertificateAttribute(String aACertificateAttribute)
        {
            this.aACertificateAttribute = aACertificateAttribute;

            return this;
        }

        /**
         * @param attributeDescriptorCertificateAttribute
         *                                       Attribute name(s) in the LDAP directory where self signed
         *                                       attribute certificates for attribute authorities are stored.
         *                                       Separated by space. Defaults to
         *                                       "attributeDescriptorCertificate" if <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeDescriptorCertificateAttribute(String attributeDescriptorCertificateAttribute)
        {
            this.attributeDescriptorCertificateAttribute = attributeDescriptorCertificateAttribute;

            return this;
        }

        /**
         * @param attributeCertificateRevocationListAttribute
         *                                       Attribute name(s) in the LDAP directory where CRLs for
         *                                       attribute certificates are stored. Separated by space.
         *                                       Defaults to "attributeCertificateRevocationList" if
         *                                       <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeCertificateRevocationListAttribute(String attributeCertificateRevocationListAttribute)
        {
            this.attributeCertificateRevocationListAttribute = attributeCertificateRevocationListAttribute;

            return this;
        }

        /**
         * @param attributeAuthorityRevocationListAttribute
         *                                       Attribute name(s) in the LDAP directory where RLs for
         *                                       attribute authority attribute certificates are stored.
         *                                       Separated by space. Defaults to
         *                                       "attributeAuthorityRevocationList" if <code>null</code>.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeAuthorityRevocationListAttribute(String attributeAuthorityRevocationListAttribute)
        {
            this.attributeAuthorityRevocationListAttribute = attributeAuthorityRevocationListAttribute;

            return this;
        }

        /**
         * @param ldapUserCertificateAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search
         *                                       for the attribute value of the specified
         *                                       <code>userCertificateSubjectAttributeName</code>. E.g. if
         *                                       "cn" is used to put information about the subject for end
         *                                       certificates, then specify "cn".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapUserCertificateAttributeName(String ldapUserCertificateAttributeName)
        {
            this.ldapUserCertificateAttributeName = ldapUserCertificateAttributeName;

            return this;
        }

        /**
         * @param ldapCACertificateAttributeName The attribute name(s) in the LDAP directory where to search
         *                                       for the attribute value of the specified
         *                                       <code>cACertificateSubjectAttributeName</code>. E.g. if
         *                                       "ou" is used to put information about the subject for CA
         *                                       certificates, then specify "ou".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapCACertificateAttributeName(String ldapCACertificateAttributeName)
        {
            this.ldapCACertificateAttributeName = ldapCACertificateAttributeName;

            return this;
        }

        /**
         * @param ldapCrossCertificateAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>crossCertificateSubjectAttributeName</code>. E.g. if
         *                                       "o" is used to put information about the subject for cross
         *                                       certificates, then specify "o".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapCrossCertificateAttributeName(String ldapCrossCertificateAttributeName)
        {
            this.ldapCrossCertificateAttributeName = ldapCrossCertificateAttributeName;

            return this;
        }

        /**
         * @param ldapCertificateRevocationListAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>certificateRevocationListIssuerAttributeName</code>.
         *                                       E.g. if "ou" is used to put information about the issuer of
         *                                       CRLs, specify "ou".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapCertificateRevocationListAttributeName(String ldapCertificateRevocationListAttributeName)
        {
            this.ldapCertificateRevocationListAttributeName = ldapCertificateRevocationListAttributeName;

            return this;
        }

        /**
         * @param ldapDeltaRevocationListAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>deltaRevocationListIssuerAttributeName</code>. E.g.
         *                                       if "ou" is used to put information about the issuer of CRLs,
         *                                       specify "ou".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapDeltaRevocationListAttributeName(String ldapDeltaRevocationListAttributeName)
        {
            this.ldapDeltaRevocationListAttributeName = ldapDeltaRevocationListAttributeName;

            return this;
        }

        /**
         * @param ldapAuthorityRevocationListAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>authorityRevocationListIssuerAttributeName</code>.
         *                                       E.g. if "ou" is used to put information about the issuer of
         *                                       CRLs, specify "ou".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapAuthorityRevocationListAttributeName(String ldapAuthorityRevocationListAttributeName)
        {
            this.ldapAuthorityRevocationListAttributeName = ldapAuthorityRevocationListAttributeName;

            return this;
        }

        /**
         * @param ldapAttributeCertificateAttributeAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>attributeCertificateAttributeSubjectAttributeName</code>.
         *                                       E.g. if "cn" is used to put information about the subject of
         *                                       end attribute certificates, specify "cn".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapAttributeCertificateAttributeAttributeName(String ldapAttributeCertificateAttributeAttributeName)
        {
            this.ldapAttributeCertificateAttributeAttributeName = ldapAttributeCertificateAttributeAttributeName;

            return this;
        }

        /**
         * @param ldapAACertificateAttributeName The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>aACertificateSubjectAttributeName</code>. E.g. if
         *                                       "ou" is used to put information about the subject of attribute
         *                                       authority attribute certificates, specify "ou".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapAACertificateAttributeName(String ldapAACertificateAttributeName)
        {
            this.ldapAACertificateAttributeName = ldapAACertificateAttributeName;

            return this;
        }

        /**
         * @param ldapAttributeDescriptorCertificateAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>attributeDescriptorCertificateSubjectAttributeName</code>.
         *                                       E.g. if "o" is used to put information about the subject of
         *                                       self signed attribute authority attribute certificates,
         *                                       specify "o".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapAttributeDescriptorCertificateAttributeName(String ldapAttributeDescriptorCertificateAttributeName)
        {
            this.ldapAttributeDescriptorCertificateAttributeName = ldapAttributeDescriptorCertificateAttributeName;

            return this;
        }

        /**
         * @param ldapAttributeCertificateRevocationListAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>attributeCertificateRevocationListIssuerAttributeName</code>.
         *                                       E.g. if "ou" is used to put information about the issuer of
         *                                       CRLs, specify "ou".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapAttributeCertificateRevocationListAttributeName(String ldapAttributeCertificateRevocationListAttributeName)
        {
            this.ldapAttributeCertificateRevocationListAttributeName = ldapAttributeCertificateRevocationListAttributeName;

            return this;
        }

        /**
         * @param ldapAttributeAuthorityRevocationListAttributeName
         *                                       The attribute name(s) in the LDAP directory where to search for
         *                                       the attribute value of the specified
         *                                       <code>attributeAuthorityRevocationListIssuerAttributeName</code>.
         *                                       E.g. if "ou" is used to put information about the issuer of
         *                                       CRLs, specify "ou".
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setLdapAttributeAuthorityRevocationListAttributeName(String ldapAttributeAuthorityRevocationListAttributeName)
        {
            this.ldapAttributeAuthorityRevocationListAttributeName = ldapAttributeAuthorityRevocationListAttributeName;

            return this;
        }

        /**
         * @param userCertificateSubjectAttributeName
         *                                       Attribute(s) in the subject of the certificate which is used
         *                                       to be searched in the
         *                                       <code>ldapUserCertificateAttributeName</code>. E.g. the
         *                                       "cn" attribute of the DN could be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setUserCertificateSubjectAttributeName(String userCertificateSubjectAttributeName)
        {
            this.userCertificateSubjectAttributeName = userCertificateSubjectAttributeName;

            return this;
        }

        /**
         * @param cACertificateSubjectAttributeName
         *                                       Attribute(s) in the subject of the certificate which is used
         *                                       to be searched in the
         *                                       <code>ldapCACertificateAttributeName</code>. E.g. the "ou"
         *                                       attribute of the DN could be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setCACertificateSubjectAttributeName(String cACertificateSubjectAttributeName)
        {
            this.cACertificateSubjectAttributeName = cACertificateSubjectAttributeName;

            return this;
        }

        /**
         * @param crossCertificateSubjectAttributeName
         *                                       Attribute(s) in the subject of the cross certificate which is
         *                                       used to be searched in the
         *                                       <code>ldapCrossCertificateAttributeName</code>. E.g. the
         *                                       "o" attribute of the DN may be appropriate.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setCrossCertificateSubjectAttributeName(String crossCertificateSubjectAttributeName)
        {
            this.crossCertificateSubjectAttributeName = crossCertificateSubjectAttributeName;

            return this;
        }

        /**
         * @param certificateRevocationListIssuerAttributeName
         *                                       Attribute(s) in the issuer of the CRL which is used to be
         *                                       searched in the
         *                                       <code>ldapCertificateRevocationListAttributeName</code>.
         *                                       E.g. the "o" or "ou" attribute may be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setCertificateRevocationListIssuerAttributeName(String certificateRevocationListIssuerAttributeName)
        {
            this.certificateRevocationListIssuerAttributeName = certificateRevocationListIssuerAttributeName;

            return this;
        }

        /**
         * @param deltaRevocationListIssuerAttributeName
         *                                       Attribute(s) in the issuer of the CRL which is used to be
         *                                       searched in the
         *                                       <code>ldapDeltaRevocationListAttributeName</code>. E.g. the
         *                                       "o" or "ou" attribute may be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setDeltaRevocationListIssuerAttributeName(String deltaRevocationListIssuerAttributeName)
        {
            this.deltaRevocationListIssuerAttributeName = deltaRevocationListIssuerAttributeName;

            return this;
        }

        /**
         * @param authorityRevocationListIssuerAttributeName
         *                                       Attribute(s) in the issuer of the CRL which is used to be
         *                                       searched in the
         *                                       <code>ldapAuthorityRevocationListAttributeName</code>. E.g.
         *                                       the "o" or "ou" attribute may be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAuthorityRevocationListIssuerAttributeName(String authorityRevocationListIssuerAttributeName)
        {
            this.authorityRevocationListIssuerAttributeName = authorityRevocationListIssuerAttributeName;

            return this;
        }

        /**
         * @param attributeCertificateAttributeSubjectAttributeName
         *                                       Attribute(s) in the subject of the attribute certificate which
         *                                       is used to be searched in the
         *                                       <code>ldapAttributeCertificateAttributeAttributeName</code>.
         *                                       E.g. the "cn" attribute of the DN could be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeCertificateAttributeSubjectAttributeName(String attributeCertificateAttributeSubjectAttributeName)
        {
            this.attributeCertificateAttributeSubjectAttributeName = attributeCertificateAttributeSubjectAttributeName;

            return this;
        }

        /**
         * @param aACertificateSubjectAttributeName
         *                                       Attribute(s) in the subject of the attribute certificate which
         *                                       is used to be searched in the
         *                                       <code>ldapAACertificateAttributeName</code>. E.g. the "ou"
         *                                       attribute of the DN could be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAACertificateSubjectAttributeName(String aACertificateSubjectAttributeName)
        {
            this.aACertificateSubjectAttributeName = aACertificateSubjectAttributeName;

            return this;
        }

        /**
         * @param attributeDescriptorCertificateSubjectAttributeName
         *                                       Attribute(s) in the subject of the attribute certificate which
         *                                       is used to be searched in the
         *                                       <code>ldapAttributeDescriptorCertificateAttributeName</code>.
         *                                       E.g. the "o" attribute of the DN could be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeDescriptorCertificateSubjectAttributeName(String attributeDescriptorCertificateSubjectAttributeName)
        {
            this.attributeDescriptorCertificateSubjectAttributeName = attributeDescriptorCertificateSubjectAttributeName;

            return this;
        }

        /**
         * @param attributeCertificateRevocationListIssuerAttributeName
         *                                       Attribute(s) in the issuer of the CRL which is used to be
         *                                       searched in the
         *                                       <code>ldapAttributeCertificateRevocationListAttributeName</code>.
         *                                       E.g. the "o" or "ou" attribute may be used
         *                                       certificate is searched in this LDAP attribute.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeCertificateRevocationListIssuerAttributeName(String attributeCertificateRevocationListIssuerAttributeName)
        {
            this.attributeCertificateRevocationListIssuerAttributeName = attributeCertificateRevocationListIssuerAttributeName;

            return this;
        }

        /**
         * @param attributeAuthorityRevocationListIssuerAttributeName
         *                                       Anttribute(s) in the issuer of the CRL which is used to be
         *                                       searched in the
         *                                       <code>ldapAttributeAuthorityRevocationListAttributeName</code>.
         *                                       E.g. the "o" or "ou" attribute may be used.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setAttributeAuthorityRevocationListIssuerAttributeName(String attributeAuthorityRevocationListIssuerAttributeName)
        {
            this.attributeAuthorityRevocationListIssuerAttributeName = attributeAuthorityRevocationListIssuerAttributeName;

            return this;
        }

        /**
         *
         * @param searchForSerialNumberIn        If not <code>null</code> the serial number of the
         *                                       certificate is searched in this LDAP attribute.
         * @throws IllegalArgumentException if a necessary parameter is <code>null</code>.
         * @return the builder
         */
        public Builder setSearchForSerialNumberIn(String searchForSerialNumberIn)
        {
            this.searchForSerialNumberIn = searchForSerialNumberIn;

            return this;
        }

        public X509LDAPCertStoreParameters build()
        {
             if (ldapUserCertificateAttributeName == null   // migrate to setters
                || ldapCACertificateAttributeName == null
                || ldapCrossCertificateAttributeName == null
                || ldapCertificateRevocationListAttributeName == null
                || ldapDeltaRevocationListAttributeName == null
                || ldapAuthorityRevocationListAttributeName == null
                || ldapAttributeCertificateAttributeAttributeName == null
                || ldapAACertificateAttributeName == null
                || ldapAttributeDescriptorCertificateAttributeName == null
                || ldapAttributeCertificateRevocationListAttributeName == null
                || ldapAttributeAuthorityRevocationListAttributeName == null
                || userCertificateSubjectAttributeName == null
                || cACertificateSubjectAttributeName == null
                || crossCertificateSubjectAttributeName == null
                || certificateRevocationListIssuerAttributeName == null
                || deltaRevocationListIssuerAttributeName == null
                || authorityRevocationListIssuerAttributeName == null
                || attributeCertificateAttributeSubjectAttributeName == null
                || aACertificateSubjectAttributeName == null
                || attributeDescriptorCertificateSubjectAttributeName == null
                || attributeCertificateRevocationListIssuerAttributeName == null
                || attributeAuthorityRevocationListIssuerAttributeName == null)
            {
                throw new IllegalArgumentException(
                    "Necessary parameters not specified.");
            }
            return new X509LDAPCertStoreParameters(this);
        }
    }


    private X509LDAPCertStoreParameters(Builder builder)
    {
        this.ldapURL = builder.ldapURL;
        this.baseDN = builder.baseDN;

        this.userCertificateAttribute = builder.userCertificateAttribute;
        this.cACertificateAttribute = builder.cACertificateAttribute;
        this.crossCertificateAttribute = builder.crossCertificateAttribute;
        this.certificateRevocationListAttribute = builder.certificateRevocationListAttribute;
        this.deltaRevocationListAttribute = builder.deltaRevocationListAttribute;
        this.authorityRevocationListAttribute = builder.authorityRevocationListAttribute;
        this.attributeCertificateAttributeAttribute = builder.attributeCertificateAttributeAttribute;
        this.aACertificateAttribute = builder.aACertificateAttribute;
        this.attributeDescriptorCertificateAttribute = builder.attributeDescriptorCertificateAttribute;
        this.attributeCertificateRevocationListAttribute = builder.attributeCertificateRevocationListAttribute;
        this.attributeAuthorityRevocationListAttribute = builder.attributeAuthorityRevocationListAttribute;
        this.ldapUserCertificateAttributeName = builder.ldapUserCertificateAttributeName;
        this.ldapCACertificateAttributeName = builder.ldapCACertificateAttributeName;
        this.ldapCrossCertificateAttributeName = builder.ldapCrossCertificateAttributeName;
        this.ldapCertificateRevocationListAttributeName = builder.ldapCertificateRevocationListAttributeName;
        this.ldapDeltaRevocationListAttributeName = builder.ldapDeltaRevocationListAttributeName;
        this.ldapAuthorityRevocationListAttributeName = builder.ldapAuthorityRevocationListAttributeName;
        this.ldapAttributeCertificateAttributeAttributeName = builder.ldapAttributeCertificateAttributeAttributeName;
        this.ldapAACertificateAttributeName = builder.ldapAACertificateAttributeName;
        this.ldapAttributeDescriptorCertificateAttributeName = builder.ldapAttributeDescriptorCertificateAttributeName;
        this.ldapAttributeCertificateRevocationListAttributeName = builder.ldapAttributeCertificateRevocationListAttributeName;
        this.ldapAttributeAuthorityRevocationListAttributeName = builder.ldapAttributeAuthorityRevocationListAttributeName;
        this.userCertificateSubjectAttributeName = builder.userCertificateSubjectAttributeName;
        this.cACertificateSubjectAttributeName = builder.cACertificateSubjectAttributeName;
        this.crossCertificateSubjectAttributeName = builder.crossCertificateSubjectAttributeName;
        this.certificateRevocationListIssuerAttributeName = builder.certificateRevocationListIssuerAttributeName;
        this.deltaRevocationListIssuerAttributeName = builder.deltaRevocationListIssuerAttributeName;
        this.authorityRevocationListIssuerAttributeName = builder.authorityRevocationListIssuerAttributeName;
        this.attributeCertificateAttributeSubjectAttributeName = builder.attributeCertificateAttributeSubjectAttributeName;
        this.aACertificateSubjectAttributeName = builder.aACertificateSubjectAttributeName;
        this.attributeDescriptorCertificateSubjectAttributeName = builder.attributeDescriptorCertificateSubjectAttributeName;
        this.attributeCertificateRevocationListIssuerAttributeName = builder.attributeCertificateRevocationListIssuerAttributeName;
        this.attributeAuthorityRevocationListIssuerAttributeName = builder.attributeAuthorityRevocationListIssuerAttributeName;
        this.searchForSerialNumberIn = builder.searchForSerialNumberIn;
    }

    /**
     * Returns a clone of this object.
     */
    public Object clone()
    {
        return this;
    }

    public boolean equal(Object o)
    {
        if (o == this)
        {
            return true;
        }

        if (!(o instanceof X509LDAPCertStoreParameters))
        {
            return false;
        }

        X509LDAPCertStoreParameters params = (X509LDAPCertStoreParameters)o;
        return checkField(ldapURL, params.ldapURL)
            && checkField(baseDN, params.baseDN)
            && checkField(userCertificateAttribute, params.userCertificateAttribute)
            && checkField(cACertificateAttribute, params.cACertificateAttribute)
            && checkField(crossCertificateAttribute, params.crossCertificateAttribute)
            && checkField(certificateRevocationListAttribute, params.certificateRevocationListAttribute)
            && checkField(deltaRevocationListAttribute, params.deltaRevocationListAttribute)
            && checkField(authorityRevocationListAttribute, params.authorityRevocationListAttribute)
            && checkField(attributeCertificateAttributeAttribute, params.attributeCertificateAttributeAttribute)
            && checkField(aACertificateAttribute, params.aACertificateAttribute)
            && checkField(attributeDescriptorCertificateAttribute, params.attributeDescriptorCertificateAttribute)
            && checkField(attributeCertificateRevocationListAttribute, params.attributeCertificateRevocationListAttribute)
            && checkField(attributeAuthorityRevocationListAttribute, params.attributeAuthorityRevocationListAttribute)
            && checkField(ldapUserCertificateAttributeName, params.ldapUserCertificateAttributeName)
            && checkField(ldapCACertificateAttributeName, params.ldapCACertificateAttributeName)
            && checkField(ldapCrossCertificateAttributeName, params.ldapCrossCertificateAttributeName)
            && checkField(ldapCertificateRevocationListAttributeName, params.ldapCertificateRevocationListAttributeName)
            && checkField(ldapDeltaRevocationListAttributeName, params.ldapDeltaRevocationListAttributeName)
            && checkField(ldapAuthorityRevocationListAttributeName, params.ldapAuthorityRevocationListAttributeName)
            && checkField(ldapAttributeCertificateAttributeAttributeName, params.ldapAttributeCertificateAttributeAttributeName)
            && checkField(ldapAACertificateAttributeName, params.ldapAACertificateAttributeName)
            && checkField(ldapAttributeDescriptorCertificateAttributeName, params.ldapAttributeDescriptorCertificateAttributeName)
            && checkField(ldapAttributeCertificateRevocationListAttributeName, params.ldapAttributeCertificateRevocationListAttributeName)
            && checkField(ldapAttributeAuthorityRevocationListAttributeName, params.ldapAttributeAuthorityRevocationListAttributeName)
            && checkField(userCertificateSubjectAttributeName, params.userCertificateSubjectAttributeName)
            && checkField(cACertificateSubjectAttributeName, params.cACertificateSubjectAttributeName)
            && checkField(crossCertificateSubjectAttributeName, params.crossCertificateSubjectAttributeName)
            && checkField(certificateRevocationListIssuerAttributeName, params.certificateRevocationListIssuerAttributeName)
            && checkField(deltaRevocationListIssuerAttributeName, params.deltaRevocationListIssuerAttributeName)
            && checkField(authorityRevocationListIssuerAttributeName, params.authorityRevocationListIssuerAttributeName)
            && checkField(attributeCertificateAttributeSubjectAttributeName, params.attributeCertificateAttributeSubjectAttributeName)
            && checkField(aACertificateSubjectAttributeName, params.aACertificateSubjectAttributeName)
            && checkField(attributeDescriptorCertificateSubjectAttributeName, params.attributeDescriptorCertificateSubjectAttributeName)
            && checkField(attributeCertificateRevocationListIssuerAttributeName, params.attributeCertificateRevocationListIssuerAttributeName)
            && checkField(attributeAuthorityRevocationListIssuerAttributeName, params.attributeAuthorityRevocationListIssuerAttributeName)
            && checkField(searchForSerialNumberIn, params.searchForSerialNumberIn);
    }

    private boolean checkField(Object o1, Object o2)
    {
        if (o1 == o2)
        {
            return true;
        }

        if (o1 == null)
        {
            return false;
        }

        return o1.equals(o2);
    }

    public int hashCode()
    {
        int hash = 0;

        hash = addHashCode(hash, userCertificateAttribute);
        hash = addHashCode(hash, cACertificateAttribute);
        hash = addHashCode(hash, crossCertificateAttribute);
        hash = addHashCode(hash, certificateRevocationListAttribute);
        hash = addHashCode(hash, deltaRevocationListAttribute);
        hash = addHashCode(hash, authorityRevocationListAttribute);
        hash = addHashCode(hash, attributeCertificateAttributeAttribute);
        hash = addHashCode(hash, aACertificateAttribute);
        hash = addHashCode(hash, attributeDescriptorCertificateAttribute);
        hash = addHashCode(hash, attributeCertificateRevocationListAttribute);
        hash = addHashCode(hash, attributeAuthorityRevocationListAttribute);
        hash = addHashCode(hash, ldapUserCertificateAttributeName);
        hash = addHashCode(hash, ldapCACertificateAttributeName);
        hash = addHashCode(hash, ldapCrossCertificateAttributeName);
        hash = addHashCode(hash, ldapCertificateRevocationListAttributeName);
        hash = addHashCode(hash, ldapDeltaRevocationListAttributeName);
        hash = addHashCode(hash, ldapAuthorityRevocationListAttributeName);
        hash = addHashCode(hash, ldapAttributeCertificateAttributeAttributeName);
        hash = addHashCode(hash, ldapAACertificateAttributeName);
        hash = addHashCode(hash, ldapAttributeDescriptorCertificateAttributeName);
        hash = addHashCode(hash, ldapAttributeCertificateRevocationListAttributeName);
        hash = addHashCode(hash, ldapAttributeAuthorityRevocationListAttributeName);
        hash = addHashCode(hash, userCertificateSubjectAttributeName);
        hash = addHashCode(hash, cACertificateSubjectAttributeName);
        hash = addHashCode(hash, crossCertificateSubjectAttributeName);
        hash = addHashCode(hash, certificateRevocationListIssuerAttributeName);
        hash = addHashCode(hash, deltaRevocationListIssuerAttributeName);
        hash = addHashCode(hash, authorityRevocationListIssuerAttributeName);
        hash = addHashCode(hash, attributeCertificateAttributeSubjectAttributeName);
        hash = addHashCode(hash, aACertificateSubjectAttributeName);
        hash = addHashCode(hash, attributeDescriptorCertificateSubjectAttributeName);
        hash = addHashCode(hash, attributeCertificateRevocationListIssuerAttributeName);
        hash = addHashCode(hash, attributeAuthorityRevocationListIssuerAttributeName);
        hash = addHashCode(hash, searchForSerialNumberIn);
        
        return hash;
    }

    private int addHashCode(int hashCode, Object o)
    {
        return (hashCode * 29) + (o == null ? 0 : o.hashCode());
    }

    /**
     * @return Returns the aACertificateAttribute.
     */
    public String getAACertificateAttribute()
    {
        return aACertificateAttribute;
    }

    /**
     * @return Returns the aACertificateSubjectAttributeName.
     */
    public String getAACertificateSubjectAttributeName()
    {
        return aACertificateSubjectAttributeName;
    }

    /**
     * @return Returns the attributeAuthorityRevocationListAttribute.
     */
    public String getAttributeAuthorityRevocationListAttribute()
    {
        return attributeAuthorityRevocationListAttribute;
    }

    /**
     * @return Returns the attributeAuthorityRevocationListIssuerAttributeName.
     */
    public String getAttributeAuthorityRevocationListIssuerAttributeName()
    {
        return attributeAuthorityRevocationListIssuerAttributeName;
    }

    /**
     * @return Returns the attributeCertificateAttributeAttribute.
     */
    public String getAttributeCertificateAttributeAttribute()
    {
        return attributeCertificateAttributeAttribute;
    }

    /**
     * @return Returns the attributeCertificateAttributeSubjectAttributeName.
     */
    public String getAttributeCertificateAttributeSubjectAttributeName()
    {
        return attributeCertificateAttributeSubjectAttributeName;
    }

    /**
     * @return Returns the attributeCertificateRevocationListAttribute.
     */
    public String getAttributeCertificateRevocationListAttribute()
    {
        return attributeCertificateRevocationListAttribute;
    }

    /**
     * @return Returns the
     *         attributeCertificateRevocationListIssuerAttributeName.
     */
    public String getAttributeCertificateRevocationListIssuerAttributeName()
    {
        return attributeCertificateRevocationListIssuerAttributeName;
    }

    /**
     * @return Returns the attributeDescriptorCertificateAttribute.
     */
    public String getAttributeDescriptorCertificateAttribute()
    {
        return attributeDescriptorCertificateAttribute;
    }

    /**
     * @return Returns the attributeDescriptorCertificateSubjectAttributeName.
     */
    public String getAttributeDescriptorCertificateSubjectAttributeName()
    {
        return attributeDescriptorCertificateSubjectAttributeName;
    }

    /**
     * @return Returns the authorityRevocationListAttribute.
     */
    public String getAuthorityRevocationListAttribute()
    {
        return authorityRevocationListAttribute;
    }

    /**
     * @return Returns the authorityRevocationListIssuerAttributeName.
     */
    public String getAuthorityRevocationListIssuerAttributeName()
    {
        return authorityRevocationListIssuerAttributeName;
    }

    /**
     * @return Returns the baseDN.
     */
    public String getBaseDN()
    {
        return baseDN;
    }

    /**
     * @return Returns the cACertificateAttribute.
     */
    public String getCACertificateAttribute()
    {
        return cACertificateAttribute;
    }

    /**
     * @return Returns the cACertificateSubjectAttributeName.
     */
    public String getCACertificateSubjectAttributeName()
    {
        return cACertificateSubjectAttributeName;
    }

    /**
     * @return Returns the certificateRevocationListAttribute.
     */
    public String getCertificateRevocationListAttribute()
    {
        return certificateRevocationListAttribute;
    }

    /**
     * @return Returns the certificateRevocationListIssuerAttributeName.
     */
    public String getCertificateRevocationListIssuerAttributeName()
    {
        return certificateRevocationListIssuerAttributeName;
    }

    /**
     * @return Returns the crossCertificateAttribute.
     */
    public String getCrossCertificateAttribute()
    {
        return crossCertificateAttribute;
    }

    /**
     * @return Returns the crossCertificateSubjectAttributeName.
     */
    public String getCrossCertificateSubjectAttributeName()
    {
        return crossCertificateSubjectAttributeName;
    }

    /**
     * @return Returns the deltaRevocationListAttribute.
     */
    public String getDeltaRevocationListAttribute()
    {
        return deltaRevocationListAttribute;
    }

    /**
     * @return Returns the deltaRevocationListIssuerAttributeName.
     */
    public String getDeltaRevocationListIssuerAttributeName()
    {
        return deltaRevocationListIssuerAttributeName;
    }

    /**
     * @return Returns the ldapAACertificateAttributeName.
     */
    public String getLdapAACertificateAttributeName()
    {
        return ldapAACertificateAttributeName;
    }

    /**
     * @return Returns the ldapAttributeAuthorityRevocationListAttributeName.
     */
    public String getLdapAttributeAuthorityRevocationListAttributeName()
    {
        return ldapAttributeAuthorityRevocationListAttributeName;
    }

    /**
     * @return Returns the ldapAttributeCertificateAttributeAttributeName.
     */
    public String getLdapAttributeCertificateAttributeAttributeName()
    {
        return ldapAttributeCertificateAttributeAttributeName;
    }

    /**
     * @return Returns the ldapAttributeCertificateRevocationListAttributeName.
     */
    public String getLdapAttributeCertificateRevocationListAttributeName()
    {
        return ldapAttributeCertificateRevocationListAttributeName;
    }

    /**
     * @return Returns the ldapAttributeDescriptorCertificateAttributeName.
     */
    public String getLdapAttributeDescriptorCertificateAttributeName()
    {
        return ldapAttributeDescriptorCertificateAttributeName;
    }

    /**
     * @return Returns the ldapAuthorityRevocationListAttributeName.
     */
    public String getLdapAuthorityRevocationListAttributeName()
    {
        return ldapAuthorityRevocationListAttributeName;
    }

    /**
     * @return Returns the ldapCACertificateAttributeName.
     */
    public String getLdapCACertificateAttributeName()
    {
        return ldapCACertificateAttributeName;
    }

    /**
     * @return Returns the ldapCertificateRevocationListAttributeName.
     */
    public String getLdapCertificateRevocationListAttributeName()
    {
        return ldapCertificateRevocationListAttributeName;
    }

    /**
     * @return Returns the ldapCrossCertificateAttributeName.
     */
    public String getLdapCrossCertificateAttributeName()
    {
        return ldapCrossCertificateAttributeName;
    }

    /**
     * @return Returns the ldapDeltaRevocationListAttributeName.
     */
    public String getLdapDeltaRevocationListAttributeName()
    {
        return ldapDeltaRevocationListAttributeName;
    }

    /**
     * @return Returns the ldapURL.
     */
    public String getLdapURL()
    {
        return ldapURL;
    }

    /**
     * @return Returns the ldapUserCertificateAttributeName.
     */
    public String getLdapUserCertificateAttributeName()
    {
        return ldapUserCertificateAttributeName;
    }

    /**
     * @return Returns the searchForSerialNumberIn.
     */
    public String getSearchForSerialNumberIn()
    {
        return searchForSerialNumberIn;
    }

    /**
     * @return Returns the userCertificateAttribute.
     */
    public String getUserCertificateAttribute()
    {
        return userCertificateAttribute;
    }

    /**
     * @return Returns the userCertificateSubjectAttributeName.
     */
    public String getUserCertificateSubjectAttributeName()
    {
        return userCertificateSubjectAttributeName;
    }

    public static X509LDAPCertStoreParameters getInstance(LDAPCertStoreParameters params)
    {
        String server = "ldap://" + params.getServerName() + ":" + params.getPort();
        X509LDAPCertStoreParameters _params = new Builder(server, "").build();
        return _params;
    }
}
