X509NameTokenizer.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.asn1.x509;
2
3/**
4 * class for breaking up an X500 Name into it's component tokens, ala
5 * java.util.StringTokenizer. We need this class as some of the
6 * lightweight Java environment don't support classes like
7 * StringTokenizer.
8 */
9public class X509NameTokenizer
10{
11    private String          value;
12    private int             index;
13    private char            seperator;
14    private StringBuffer    buf = new StringBuffer();
15
16    public X509NameTokenizer(
17        String  oid)
18    {
19        this(oid, ',');
20    }
21
22    public X509NameTokenizer(
23        String  oid,
24        char    seperator)
25    {
26        this.value = oid;
27        this.index = -1;
28        this.seperator = seperator;
29    }
30
31    public boolean hasMoreTokens()
32    {
33        return (index != value.length());
34    }
35
36    public String nextToken()
37    {
38        if (index == value.length())
39        {
40            return null;
41        }
42
43        int     end = index + 1;
44        boolean quoted = false;
45        boolean escaped = false;
46
47        buf.setLength(0);
48
49        while (end != value.length())
50        {
51            char    c = value.charAt(end);
52
53            if (c == '"')
54            {
55                if (!escaped)
56                {
57                    quoted = !quoted;
58                }
59                else
60                {
61                    // BEGIN android-added
62                    // copied from a newer version of BouncyCastle
63                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
64                    {
65                        buf.append('\\');
66                    }
67                    else if (c == '+' && seperator != '+')
68                    {
69                        buf.append('\\');
70                    }
71                    // END android-added
72                    buf.append(c);
73                }
74                escaped = false;
75            }
76            else
77            {
78                if (escaped || quoted)
79                {
80                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
81                    {
82                        buf.append('\\');
83                    }
84                    else if (c == '+' && seperator != '+')
85                    {
86                        buf.append('\\');
87                    }
88                    buf.append(c);
89                    escaped = false;
90                }
91                else if (c == '\\')
92                {
93                    escaped = true;
94                }
95                else if (c == seperator)
96                {
97                    break;
98                }
99                else
100                {
101                    buf.append(c);
102                }
103            }
104            end++;
105        }
106
107        index = end;
108        return buf.toString().trim();
109    }
110}
111