001package org.apache.commons.ssl.org.bouncycastle.asn1.esf;
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.DERSequence;
010
011/**
012 * Commitment type qualifiers, used in the Commitment-Type-Indication attribute (RFC3126).
013 * 
014 * <pre>
015 *   CommitmentTypeQualifier ::= SEQUENCE {
016 *       commitmentTypeIdentifier  CommitmentTypeIdentifier,
017 *       qualifier          ANY DEFINED BY commitmentTypeIdentifier OPTIONAL }
018 * </pre>
019 */
020public class CommitmentTypeQualifier
021    extends ASN1Object
022{
023   private ASN1ObjectIdentifier commitmentTypeIdentifier;
024   private ASN1Encodable qualifier;
025
026   /**
027    * Creates a new <code>CommitmentTypeQualifier</code> instance.
028    *
029    * @param commitmentTypeIdentifier a <code>CommitmentTypeIdentifier</code> value
030    */
031    public CommitmentTypeQualifier(
032        ASN1ObjectIdentifier commitmentTypeIdentifier)
033    {
034        this(commitmentTypeIdentifier, null);
035    }
036    
037   /**
038    * Creates a new <code>CommitmentTypeQualifier</code> instance.
039    *
040    * @param commitmentTypeIdentifier a <code>CommitmentTypeIdentifier</code> value
041    * @param qualifier the qualifier, defined by the above field.
042    */
043    public CommitmentTypeQualifier(
044        ASN1ObjectIdentifier commitmentTypeIdentifier,
045        ASN1Encodable qualifier)
046    {
047        this.commitmentTypeIdentifier = commitmentTypeIdentifier;
048        this.qualifier = qualifier;
049    }
050
051    /**
052     * Creates a new <code>CommitmentTypeQualifier</code> instance.
053     *
054     * @param as <code>CommitmentTypeQualifier</code> structure
055     * encoded as an ASN1Sequence. 
056     */
057    private CommitmentTypeQualifier(
058        ASN1Sequence as)
059    {
060        commitmentTypeIdentifier = (ASN1ObjectIdentifier)as.getObjectAt(0);
061        
062        if (as.size() > 1)
063        {
064            qualifier = as.getObjectAt(1);
065        }
066    }
067
068    public static CommitmentTypeQualifier getInstance(Object as)
069    {
070        if (as instanceof CommitmentTypeQualifier)
071        {
072            return (CommitmentTypeQualifier)as;
073        }
074        else if (as != null)
075        {
076            return new CommitmentTypeQualifier(ASN1Sequence.getInstance(as));
077        }
078
079        return null;
080    }
081
082    public ASN1ObjectIdentifier getCommitmentTypeIdentifier()
083    {
084        return commitmentTypeIdentifier;
085    }
086    
087    public ASN1Encodable getQualifier()
088    {
089        return qualifier;
090    }
091
092   /**
093    * Returns a DER-encodable representation of this instance. 
094    *
095    * @return a <code>ASN1Primitive</code> value
096    */
097   public ASN1Primitive toASN1Primitive()
098   {
099      ASN1EncodableVector dev = new ASN1EncodableVector();
100      dev.add(commitmentTypeIdentifier);
101      if (qualifier != null)
102      {
103          dev.add(qualifier);
104      }
105
106      return new DERSequence(dev);
107   }
108}