001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Set;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
011
012public class Attribute
013    extends ASN1Object
014{
015    private ASN1ObjectIdentifier attrType;
016    private ASN1Set             attrValues;
017
018    /**
019     * return an Attribute object from the given object.
020     *
021     * @param o the object we want converted.
022     * @exception IllegalArgumentException if the object cannot be converted.
023     */
024    public static Attribute getInstance(
025        Object o)
026    {
027        if (o instanceof Attribute)
028        {
029            return (Attribute)o;
030        }
031        
032        if (o != null)
033        {
034            return new Attribute(ASN1Sequence.getInstance(o));
035        }
036
037        return null;
038    }
039    
040    private Attribute(
041        ASN1Sequence seq)
042    {
043        if (seq.size() != 2)
044        {
045            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
046        }
047
048        attrType = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0));
049        attrValues = ASN1Set.getInstance(seq.getObjectAt(1));
050    }
051
052    public Attribute(
053        ASN1ObjectIdentifier attrType,
054        ASN1Set             attrValues)
055    {
056        this.attrType = attrType;
057        this.attrValues = attrValues;
058    }
059
060    public ASN1ObjectIdentifier getAttrType()
061    {
062        return new ASN1ObjectIdentifier(attrType.getId());
063    }
064
065    public ASN1Encodable[] getAttributeValues()
066    {
067        return attrValues.toArray();
068    }
069
070    public ASN1Set getAttrValues()
071    {
072        return attrValues;
073    }
074
075    /** 
076     * Produce an object suitable for an ASN1OutputStream.
077     * <pre>
078     * Attribute ::= SEQUENCE {
079     *     attrType OBJECT IDENTIFIER,
080     *     attrValues SET OF AttributeValue
081     * }
082     * </pre>
083     */
084    public ASN1Primitive toASN1Primitive()
085    {
086        ASN1EncodableVector v = new ASN1EncodableVector();
087
088        v.add(attrType);
089        v.add(attrValues);
090
091        return new DERSequence(v);
092    }
093}