001package org.apache.commons.ssl.org.bouncycastle.asn1.ocsp;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERNull;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
010
011public class CertStatus
012    extends ASN1Object
013    implements ASN1Choice
014{
015    private int             tagNo;
016    private ASN1Encodable    value;
017
018    /**
019     * create a CertStatus object with a tag of zero.
020     */
021    public CertStatus()
022    {
023        tagNo = 0;
024        value = DERNull.INSTANCE;
025    }
026
027    public CertStatus(
028        RevokedInfo info)
029    {
030        tagNo = 1;
031        value = info;
032    }
033
034    public CertStatus(
035        int tagNo,
036        ASN1Encodable    value)
037    {
038        this.tagNo = tagNo;
039        this.value = value;
040    }
041
042    public CertStatus(
043        ASN1TaggedObject    choice)
044    {
045        this.tagNo = choice.getTagNo();
046
047        switch (choice.getTagNo())
048        {
049        case 0:
050            value = DERNull.INSTANCE;
051            break;
052        case 1:
053            value = RevokedInfo.getInstance(choice, false);
054            break;
055        case 2:
056            value = DERNull.INSTANCE;
057        }
058    }
059
060    public static CertStatus getInstance(
061        Object  obj)
062    {
063        if (obj == null || obj instanceof CertStatus)
064        {
065            return (CertStatus)obj;
066        }
067        else if (obj instanceof ASN1TaggedObject)
068        {
069            return new CertStatus((ASN1TaggedObject)obj);
070        }
071
072        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
073    }
074
075    public static CertStatus getInstance(
076        ASN1TaggedObject obj,
077        boolean          explicit)
078    {
079        return getInstance(obj.getObject()); // must be explicitly tagged
080    }
081    
082    public int getTagNo()
083    {
084        return tagNo;
085    }
086
087    public ASN1Encodable getStatus()
088    {
089        return value;
090    }
091
092    /**
093     * Produce an object suitable for an ASN1OutputStream.
094     * <pre>
095     *  CertStatus ::= CHOICE {
096     *                  good        [0]     IMPLICIT NULL,
097     *                  revoked     [1]     IMPLICIT RevokedInfo,
098     *                  unknown     [2]     IMPLICIT UnknownInfo }
099     * </pre>
100     */
101    public ASN1Primitive toASN1Primitive()
102    {
103        return new DERTaggedObject(false, tagNo, value);
104    }
105}