16e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompackage org.bouncycastle.asn1.x500.style;
26e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
36e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom/**
46e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom * class for breaking up an X500 Name into it's component tokens, ala
56e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom * java.util.StringTokenizer. We need this class as some of the
66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom * lightweight Java environment don't support classes like
76e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom * StringTokenizer.
86e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom */
9d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Rootpublic class X500NameTokenizer
106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom{
116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private String          value;
126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private int             index;
13e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    private char            separator;
146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private StringBuffer    buf = new StringBuffer();
156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public X500NameTokenizer(
176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        String  oid)
186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this(oid, ',');
206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public X500NameTokenizer(
236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        String  oid,
24e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        char    separator)
256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.value = oid;
276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.index = -1;
28e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        this.separator = separator;
296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public boolean hasMoreTokens()
326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return (index != value.length());
346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public String nextToken()
376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (index == value.length())
396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return null;
416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        int     end = index + 1;
446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        boolean quoted = false;
456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        boolean escaped = false;
466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        buf.setLength(0);
486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        while (end != value.length())
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            char    c = value.charAt(end);
526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (c == '"')
546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                if (!escaped)
566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    quoted = !quoted;
586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
59a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                buf.append(c);
606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                escaped = false;
616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else
636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                if (escaped || quoted)
656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    buf.append(c);
676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    escaped = false;
686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                else if (c == '\\')
706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
71a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom                    buf.append(c);
726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    escaped = true;
736e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
74e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom                else if (c == separator)
756e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
766e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    break;
776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                else
796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    buf.append(c);
816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            end++;
846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
856e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        index = end;
87a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
88a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        return buf.toString();
896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom}
91