public static void parseOptions()

in client/src/main/java/org/apache/qpid/url/URLHelper.java [37:136]


    public static void parseOptions(Map<String, String> optionMap, String options) throws URLSyntaxException
    {
        if ((options == null) || (options.indexOf('=') == -1))
        {
            return;
        }

        int optionIndex = options.indexOf('=');

        String option = options.substring(0, optionIndex);

        int length = options.length();

        int nestedQuotes = 0;

        // to store index of final "'"
        int valueIndex = optionIndex;

        // Walk remainder of url.
        while ((nestedQuotes > 0) || (valueIndex < length))
        {
            valueIndex++;

            if (valueIndex >= length)
            {
                break;
            }

            if (options.charAt(valueIndex) == '\'')
            {
                if ((valueIndex + 1) < options.length())
                {
                    if ((options.charAt(valueIndex + 1) == DEFAULT_OPTION_SEPERATOR)
                            || (options.charAt(valueIndex + 1) == ALTERNATIVE_OPTION_SEPARATOR)
                            || (options.charAt(valueIndex + 1) == BROKER_SEPARATOR)
                            || (options.charAt(valueIndex + 1) == '\''))
                    {
                        nestedQuotes--;

                        if (nestedQuotes == 0)
                        {
                            // We've found the value of an option
                            break;
                        }
                    }
                    else
                    {
                        nestedQuotes++;
                    }
                }
                else
                {
                    // We are at the end of the string
                    // Check to see if we are corectly closing quotes
                    if (options.charAt(valueIndex) == '\'')
                    {
                        nestedQuotes--;
                    }

                    break;
                }
            }
        }

        if ((nestedQuotes != 0) || (valueIndex < (optionIndex + 2)))
        {
            int sepIndex = 0;

            // Try and identify illegal separator character
            if (nestedQuotes > 1)
            {
                for (int i = 0; i < nestedQuotes; i++)
                {
                    sepIndex = options.indexOf('\'', sepIndex);
                    sepIndex++;
                }
            }

            if ((sepIndex >= options.length()) || (sepIndex == 0))
            {
                throw parseError(valueIndex, "Unterminated option", options);
            }
            else
            {
                throw parseError(sepIndex, "Unterminated option. Possible illegal option separator:'"
                    + options.charAt(sepIndex) + "'", options);
            }
        }

        // optionIndex +2 to skip "='"
        String value = options.substring(optionIndex + 2, valueIndex);

        optionMap.put(option, value);

        if (valueIndex < (options.length() - 1))
        {
            // Recurse to get remaining options
            parseOptions(optionMap, options.substring(valueIndex + 2));
        }
    }