aboutsummaryrefslogtreecommitdiffstats
path: root/plugin/icedteanp/java/sun/applet/PluginParameterParser.java
blob: 1db6034382b4a4c79deaf872faef8867993063ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package sun.applet;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import net.sourceforge.jnlp.PluginParameters;

class PluginParameterParser {
    static private final char DELIMITER_ESCAPE = ':';
    static private final String KEY_VALUE_DELIMITER = ";";

    /**
     * Unescape characters passed from C++.
     * Specifically, "\n" -> new line, "\\" -> "\", "\:" -> ";"
     *
     * @param str The string to unescape
     * @return The unescaped string
     */
    static String unescapeString(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char chr = str.charAt(i);
            if (chr != '\\') {
                sb.append(chr);
            } else {
                i++; // Skip ahead one
                chr = str.charAt(i);
                if (chr == 'n') {
                    sb.append('\n');
                } else if (chr == '\\') {
                    sb.append('\\');
                } else if (chr == DELIMITER_ESCAPE) {
                    sb.append(KEY_VALUE_DELIMITER);
                }
            }
        }
        return sb.toString();
    }

    /**
     * Parse semi-colon delimited key-value pairs.
     * @param keyvalString the escaped, semicolon-delimited, string
     * @return a map of the keys to the values
     */
    static Map<String, String> parseEscapedKeyValuePairs(String keyvalString) {
        // Split on ';', ensuring empty strings at end are kept
        String[] strs = keyvalString.split(KEY_VALUE_DELIMITER, -1 /* Keep empty strings */);

        Map<String, String> attributes = new HashMap<String, String>();

        /* Note that we will typically have one empty string at end */
        for (int i = 0; i < strs.length - 1; i += 2) {
            String key = unescapeString(strs[i]).toLowerCase();
            String value = unescapeString(strs[i + 1]);
            attributes.put(key, value);
        }

        return attributes;
    }

    static boolean isInt(String s) {
        try {
            Integer.parseInt(s);
            return true;
        } catch(NumberFormatException e) {
            return false;
        }
    }

    /**
     * Parsers parameters given a string containing 
     * parameters in quotes.
     * 
     * @param width default applet width
     * @param height default applet height
     * @param parameterString the parameters 
     * @return the attributes in a hash table
     */
    public PluginParameters parse(String width,
            String height, String parameterString) {
        Map<String, String> params = parseEscapedKeyValuePairs(parameterString);

        if (params.get("width") == null || !isInt(params.get("width"))) {
            params.put("width", width);
        }

        if (params.get("height") == null || !isInt(params.get("height"))) {
            params.put("height", height);
        }

        return new PluginParameters(params);
    }
}