001package org.apache.commons.ssl.org.bouncycastle.asn1.x500;
002
003import java.util.Vector;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
007import org.apache.commons.ssl.org.bouncycastle.asn1.x500.style.BCStyle;
008
009public class X500NameBuilder
010{
011    private X500NameStyle template;
012    private Vector rdns = new Vector();
013
014    public X500NameBuilder()
015    {
016        this(BCStyle.INSTANCE);
017    }
018
019    public X500NameBuilder(X500NameStyle template)
020    {
021        this.template = template;
022    }
023
024    public X500NameBuilder addRDN(ASN1ObjectIdentifier oid, String value)
025    {
026        this.addRDN(oid, template.stringToValue(oid, value));
027
028        return this;
029    }
030
031    public X500NameBuilder addRDN(ASN1ObjectIdentifier oid, ASN1Encodable value)
032    {
033        rdns.addElement(new RDN(oid, value));
034
035        return this;
036    }
037
038    public X500NameBuilder addRDN(AttributeTypeAndValue attrTAndV)
039    {
040        rdns.addElement(new RDN(attrTAndV));
041
042        return this;
043    }
044
045    public X500NameBuilder addMultiValuedRDN(ASN1ObjectIdentifier[] oids, String[] values)
046    {
047        ASN1Encodable[] vals = new ASN1Encodable[values.length];
048
049        for (int i = 0; i != vals.length; i++)
050        {
051            vals[i] = template.stringToValue(oids[i], values[i]);
052        }
053
054        return addMultiValuedRDN(oids, vals);
055    }
056
057    public X500NameBuilder addMultiValuedRDN(ASN1ObjectIdentifier[] oids, ASN1Encodable[] values)
058    {
059        AttributeTypeAndValue[] avs = new AttributeTypeAndValue[oids.length];
060
061        for (int i = 0; i != oids.length; i++)
062        {
063            avs[i] = new AttributeTypeAndValue(oids[i], values[i]);
064        }
065
066        return addMultiValuedRDN(avs);
067    }
068
069    public X500NameBuilder addMultiValuedRDN(AttributeTypeAndValue[] attrTAndVs)
070    {
071        rdns.addElement(new RDN(attrTAndVs));
072
073        return this;
074    }
075
076    public X500Name build()
077    {
078        RDN[] vals = new RDN[rdns.size()];
079
080        for (int i = 0; i != vals.length; i++)
081        {
082            vals[i] = (RDN)rdns.elementAt(i);
083        }
084
085        return new X500Name(template, vals);
086    }
087}