001package org.apache.commons.ssl.org.bouncycastle.asn1.dvcs;
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.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
011
012/**
013 * <pre>
014 *     TargetEtcChain ::= SEQUENCE {
015 *         target                       CertEtcToken,
016 *         chain                        SEQUENCE SIZE (1..MAX) OF
017 *                                         CertEtcToken OPTIONAL,
018 *         pathProcInput                [0] PathProcInput OPTIONAL
019 *     }
020 * </pre>
021 */
022
023public class TargetEtcChain
024    extends ASN1Object
025{
026    private CertEtcToken target;
027    private ASN1Sequence chain;
028    private PathProcInput pathProcInput;
029
030    public TargetEtcChain(CertEtcToken target)
031    {
032        this(target, null, null);
033    }
034
035    public TargetEtcChain(CertEtcToken target, CertEtcToken[] chain)
036    {
037        this(target, chain, null);
038    }
039
040    public TargetEtcChain(CertEtcToken target, PathProcInput pathProcInput)
041    {
042        this(target, null, pathProcInput);
043    }
044
045    public TargetEtcChain(CertEtcToken target, CertEtcToken[] chain, PathProcInput pathProcInput)
046    {
047        this.target = target;
048
049        if (chain != null)
050        {
051            this.chain = new DERSequence(chain);
052        }
053
054        this.pathProcInput = pathProcInput;
055    }
056
057    private TargetEtcChain(ASN1Sequence seq)
058    {
059        int i = 0;
060        ASN1Encodable obj = seq.getObjectAt(i++);
061        this.target = CertEtcToken.getInstance(obj);
062
063        try
064        {
065            obj = seq.getObjectAt(i++);
066            this.chain = ASN1Sequence.getInstance(obj);
067        }
068        catch (IllegalArgumentException e)
069        {
070        }
071        catch (IndexOutOfBoundsException e)
072        {
073            return;
074        }
075
076        try
077        {
078            obj = seq.getObjectAt(i++);
079            ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(obj);
080            switch (tagged.getTagNo())
081            {
082            case 0:
083                this.pathProcInput = PathProcInput.getInstance(tagged, false);
084                break;
085            }
086        }
087        catch (IllegalArgumentException e)
088        {
089        }
090        catch (IndexOutOfBoundsException e)
091        {
092        }
093    }
094
095    public static TargetEtcChain getInstance(Object obj)
096    {
097        if (obj instanceof TargetEtcChain)
098        {
099            return (TargetEtcChain)obj;
100        }
101        else if (obj != null)
102        {
103            return new TargetEtcChain(ASN1Sequence.getInstance(obj));
104        }
105
106        return null;
107    }
108
109    public static TargetEtcChain getInstance(
110        ASN1TaggedObject obj,
111        boolean explicit)
112    {
113        return getInstance(ASN1Sequence.getInstance(obj, explicit));
114    }
115
116    public ASN1Primitive toASN1Primitive()
117    {
118        ASN1EncodableVector v = new ASN1EncodableVector();
119        v.add(target);
120        if (chain != null)
121        {
122            v.add(chain);
123        }
124        if (pathProcInput != null)
125        {
126            v.add(new DERTaggedObject(false, 0, pathProcInput));
127        }
128
129        return new DERSequence(v);
130    }
131
132    public String toString()
133    {
134        StringBuffer s = new StringBuffer();
135        s.append("TargetEtcChain {\n");
136        s.append("target: " + target + "\n");
137        if (chain != null)
138        {
139            s.append("chain: " + chain + "\n");
140        }
141        if (pathProcInput != null)
142        {
143            s.append("pathProcInput: " + pathProcInput + "\n");
144        }
145        s.append("}\n");
146        return s.toString();
147    }
148
149
150    public CertEtcToken getTarget()
151    {
152        return target;
153    }
154
155    public CertEtcToken[] getChain()
156    {
157        if (chain != null)
158        {
159            return CertEtcToken.arrayFromSequence(chain);
160        }
161
162        return null;
163    }
164
165    private void setChain(ASN1Sequence chain)
166    {
167        this.chain = chain;
168    }
169
170    public PathProcInput getPathProcInput()
171    {
172        return pathProcInput;
173    }
174
175    private void setPathProcInput(PathProcInput pathProcInput)
176    {
177        this.pathProcInput = pathProcInput;
178    }
179
180    public static TargetEtcChain[] arrayFromSequence(ASN1Sequence seq)
181    {
182        TargetEtcChain[] tmp = new TargetEtcChain[seq.size()];
183
184        for (int i = 0; i != tmp.length; i++)
185        {
186            tmp[i] = TargetEtcChain.getInstance(seq.getObjectAt(i));
187        }
188
189        return tmp;
190    }
191}