DistributionPoint.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1EncodableVector;
4import org.bouncycastle.asn1.ASN1Object;
5import org.bouncycastle.asn1.ASN1Primitive;
6import org.bouncycastle.asn1.ASN1Sequence;
7import org.bouncycastle.asn1.ASN1TaggedObject;
8import org.bouncycastle.asn1.DERBitString;
9import org.bouncycastle.asn1.DERSequence;
10import org.bouncycastle.asn1.DERTaggedObject;
11
12/**
13 * The DistributionPoint object.
14 * <pre>
15 * DistributionPoint ::= SEQUENCE {
16 *      distributionPoint [0] DistributionPointName OPTIONAL,
17 *      reasons           [1] ReasonFlags OPTIONAL,
18 *      cRLIssuer         [2] GeneralNames OPTIONAL
19 * }
20 * </pre>
21 */
22public class DistributionPoint
23    extends ASN1Object
24{
25    DistributionPointName       distributionPoint;
26    ReasonFlags                 reasons;
27    GeneralNames                cRLIssuer;
28
29    public static DistributionPoint getInstance(
30        ASN1TaggedObject obj,
31        boolean          explicit)
32    {
33        return getInstance(ASN1Sequence.getInstance(obj, explicit));
34    }
35
36    public static DistributionPoint getInstance(
37        Object obj)
38    {
39        if(obj == null || obj instanceof DistributionPoint)
40        {
41            return (DistributionPoint)obj;
42        }
43
44        if(obj instanceof ASN1Sequence)
45        {
46            return new DistributionPoint((ASN1Sequence)obj);
47        }
48
49        throw new IllegalArgumentException("Invalid DistributionPoint: " + obj.getClass().getName());
50    }
51
52    public DistributionPoint(
53        ASN1Sequence seq)
54    {
55        for (int i = 0; i != seq.size(); i++)
56        {
57            ASN1TaggedObject    t = ASN1TaggedObject.getInstance(seq.getObjectAt(i));
58            switch (t.getTagNo())
59            {
60            case 0:
61                distributionPoint = DistributionPointName.getInstance(t, true);
62                break;
63            case 1:
64                reasons = new ReasonFlags(DERBitString.getInstance(t, false));
65                break;
66            case 2:
67                cRLIssuer = GeneralNames.getInstance(t, false);
68            }
69        }
70    }
71
72    public DistributionPoint(
73        DistributionPointName distributionPoint,
74        ReasonFlags                 reasons,
75        GeneralNames            cRLIssuer)
76    {
77        this.distributionPoint = distributionPoint;
78        this.reasons = reasons;
79        this.cRLIssuer = cRLIssuer;
80    }
81
82    public DistributionPointName getDistributionPoint()
83    {
84        return distributionPoint;
85    }
86
87    public ReasonFlags getReasons()
88    {
89        return reasons;
90    }
91
92    public GeneralNames getCRLIssuer()
93    {
94        return cRLIssuer;
95    }
96
97    public ASN1Primitive toASN1Primitive()
98    {
99        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}
159