001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
011
012/**
013 * The DistributionPoint object.
014 * <pre>
015 * DistributionPoint ::= SEQUENCE {
016 *      distributionPoint [0] DistributionPointName OPTIONAL,
017 *      reasons           [1] ReasonFlags OPTIONAL,
018 *      cRLIssuer         [2] GeneralNames OPTIONAL
019 * }
020 * </pre>
021 */
022public class DistributionPoint
023    extends ASN1Object
024{
025    DistributionPointName       distributionPoint;
026    ReasonFlags                 reasons;
027    GeneralNames                cRLIssuer;
028
029    public static DistributionPoint getInstance(
030        ASN1TaggedObject obj,
031        boolean          explicit)
032    {
033        return getInstance(ASN1Sequence.getInstance(obj, explicit));
034    }
035
036    public static DistributionPoint getInstance(
037        Object obj)
038    {
039        if(obj == null || obj instanceof DistributionPoint) 
040        {
041            return (DistributionPoint)obj;
042        }
043        
044        if(obj instanceof ASN1Sequence) 
045        {
046            return new DistributionPoint((ASN1Sequence)obj);
047        }
048        
049        throw new IllegalArgumentException("Invalid DistributionPoint: " + obj.getClass().getName());
050    }
051
052    public DistributionPoint(
053        ASN1Sequence seq)
054    {
055        for (int i = 0; i != seq.size(); i++)
056        {
057            ASN1TaggedObject    t = ASN1TaggedObject.getInstance(seq.getObjectAt(i));
058            switch (t.getTagNo())
059            {
060            case 0:
061                distributionPoint = DistributionPointName.getInstance(t, true);
062                break;
063            case 1:
064                reasons = new ReasonFlags(DERBitString.getInstance(t, false));
065                break;
066            case 2:
067                cRLIssuer = GeneralNames.getInstance(t, false);
068            }
069        }
070    }
071    
072    public DistributionPoint(
073        DistributionPointName distributionPoint,
074        ReasonFlags                 reasons,
075        GeneralNames            cRLIssuer)
076    {
077        this.distributionPoint = distributionPoint;
078        this.reasons = reasons;
079        this.cRLIssuer = cRLIssuer;
080    }
081    
082    public DistributionPointName getDistributionPoint()
083    {
084        return distributionPoint;
085    }
086
087    public ReasonFlags getReasons()
088    {
089        return reasons;
090    }
091    
092    public GeneralNames getCRLIssuer()
093    {
094        return cRLIssuer;
095    }
096    
097    public ASN1Primitive toASN1Primitive()
098    {
099        ASN1EncodableVector  v = new ASN1EncodableVector();
100        
101        if (distributionPoint != null)
102        {
103            //
104            // as this is a CHOICE it must be explicitly tagged
105            //
106            v.add(new DERTaggedObject(0, distributionPoint));
107        }
108
109        if (reasons != null)
110        {
111            v.add(new DERTaggedObject(false, 1, reasons));
112        }
113
114        if (cRLIssuer != null)
115        {
116            v.add(new DERTaggedObject(false, 2, cRLIssuer));
117        }
118
119        return new DERSequence(v);
120    }
121
122    public String toString()
123    {
124        String       sep = System.getProperty("line.separator");
125        StringBuffer buf = new StringBuffer();
126        buf.append("DistributionPoint: [");
127        buf.append(sep);
128        if (distributionPoint != null)
129        {
130            appendObject(buf, sep, "distributionPoint", distributionPoint.toString());
131        }
132        if (reasons != null)
133        {
134            appendObject(buf, sep, "reasons", reasons.toString());
135        }
136        if (cRLIssuer != null)
137        {
138            appendObject(buf, sep, "cRLIssuer", cRLIssuer.toString());
139        }
140        buf.append("]");
141        buf.append(sep);
142        return buf.toString();
143    }
144
145    private void appendObject(StringBuffer buf, String sep, String name, String value)
146    {
147        String       indent = "    ";
148
149        buf.append(indent);
150        buf.append(name);
151        buf.append(":");
152        buf.append(sep);
153        buf.append(indent);
154        buf.append(indent);
155        buf.append(value);
156        buf.append(sep);
157    }
158}