LazyEncodedSequence.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.asn1;
2
3import java.io.IOException;
4import java.util.Enumeration;
5
6/**
7 * Note: this class is for processing DER/DL encoded sequences only.
8 */
9class LazyEncodedSequence
10    extends ASN1Sequence
11{
12    private byte[] encoded;
13
14    LazyEncodedSequence(
15        byte[] encoded)
16        throws IOException
17    {
18        this.encoded = encoded;
19    }
20
21    private void parse()
22    {
23        Enumeration en = new LazyConstructionEnumeration(encoded);
24
25        while (en.hasMoreElements())
26        {
27            seq.addElement(en.nextElement());
28        }
29
30        encoded = null;
31    }
32
33    public synchronized ASN1Encodable getObjectAt(int index)
34    {
35        if (encoded != null)
36        {
37            parse();
38        }
39
40        return super.getObjectAt(index);
41    }
42
43    public synchronized Enumeration getObjects()
44    {
45        if (encoded == null)
46        {
47            return super.getObjects();
48        }
49
50        return new LazyConstructionEnumeration(encoded);
51    }
52
53    public synchronized int size()
54    {
55        if (encoded != null)
56        {
57            parse();
58        }
59
60        return super.size();
61    }
62
63    ASN1Primitive toDERObject()
64    {
65        if (encoded != null)
66        {
67            parse();
68        }
69
70        return super.toDERObject();
71    }
72
73    ASN1Primitive toDLObject()
74    {
75        if (encoded != null)
76        {
77            parse();
78        }
79
80        return super.toDLObject();
81    }
82
83    int encodedLength()
84        throws IOException
85    {
86        if (encoded != null)
87        {
88            return 1 + StreamUtil.calculateBodyLength(encoded.length) + encoded.length;
89        }
90        else
91        {
92            return super.toDLObject().encodedLength();
93        }
94    }
95
96    void encode(
97        ASN1OutputStream out)
98        throws IOException
99    {
100        if (encoded != null)
101        {
102            out.writeEncoded(BERTags.SEQUENCE | BERTags.CONSTRUCTED, encoded);
103        }
104        else
105        {
106            super.toDLObject().encode(out);
107        }
108    }
109}
110