|
24 | 24 | */
|
25 | 25 | package org.graalvm.visualvm.jfr.impl;
|
26 | 26 |
|
| 27 | +import java.io.FileInputStream; |
| 28 | +import java.io.IOException; |
| 29 | +import java.io.InputStreamReader; |
27 | 30 | import java.util.HashMap;
|
28 | 31 | import java.util.Map;
|
| 32 | +import java.util.Properties; |
| 33 | +import java.util.logging.Level; |
| 34 | +import java.util.logging.Logger; |
29 | 35 |
|
30 | 36 | /**
|
31 | 37 | *
|
32 | 38 | * @author Jiri Sedlacek
|
33 | 39 | */
|
34 | 40 | final class JFRParameters {
|
35 | 41 |
|
| 42 | + private static final Logger LOGGER = Logger.getLogger(JFRParameters.class.getName()); |
| 43 | + |
| 44 | + |
| 45 | + private static final String FILE = "settings-file"; // NOI18N |
| 46 | + |
36 | 47 | static final String NAME = "name"; // NOI18N
|
37 | 48 | static final String SETTINGS = "settings"; // NOI18N
|
38 | 49 |
|
@@ -66,17 +77,54 @@ public String toString() {
|
66 | 77 |
|
67 | 78 |
|
68 | 79 | private static void parseParameters(String parametersS, Map<String, String> parameters) {
|
69 |
| - for (String parameter : parametersS.split(",")) { // NOI18N |
70 |
| - |
71 |
| - // name |
72 |
| - int idx = parameter.indexOf(NAME + "="); // NOI18N |
73 |
| - if (idx == 0) parameters.put(NAME, parameter.substring(NAME.length() + 1)); |
74 |
| - |
75 |
| - // settings |
76 |
| - idx = parameter.indexOf(SETTINGS + "="); // NOI18N |
77 |
| - if (idx == 0) parameters.put(SETTINGS, parameter.substring(SETTINGS.length() + 1)); |
78 |
| - |
| 80 | + if (parametersS.startsWith(FILE + "=")) { // NOI18N |
| 81 | + // settings defined in file |
| 82 | + parseParametersFile(decode(parametersS.substring(FILE.length() + 1)), parameters); |
| 83 | + } else { |
| 84 | + for (String parameter : parametersS.split(",")) { // NOI18N |
| 85 | + |
| 86 | + // name |
| 87 | + int idx = parameter.indexOf(NAME + "="); // NOI18N |
| 88 | + if (idx == 0) parameters.put(NAME, decode(parameter.substring(NAME.length() + 1))); |
| 89 | + |
| 90 | + // settings |
| 91 | + idx = parameter.indexOf(SETTINGS + "="); // NOI18N |
| 92 | + if (idx == 0) parameters.put(SETTINGS, decode(parameter.substring(SETTINGS.length() + 1))); |
| 93 | + |
| 94 | + } |
79 | 95 | }
|
80 | 96 | }
|
81 | 97 |
|
| 98 | + private static void parseParametersFile(String file, Map<String, String> parameters) { |
| 99 | + Properties properties = loadProperties(file); |
| 100 | + |
| 101 | + // name |
| 102 | + String prop = properties.getProperty(NAME); |
| 103 | + if (prop != null) parameters.put(NAME, decode(prop)); |
| 104 | + |
| 105 | + // settings |
| 106 | + prop = properties.getProperty(SETTINGS); |
| 107 | + if (prop != null) parameters.put(SETTINGS, decode(prop)); |
| 108 | + } |
| 109 | + |
| 110 | + protected static Properties loadProperties(String file) { |
| 111 | + Properties properties = new Properties(); |
| 112 | + |
| 113 | + try (InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8")) { // NOI18N |
| 114 | + properties.load(isr); |
| 115 | + } catch (IOException e) { |
| 116 | + LOGGER.log(Level.WARNING, "Failed to read JFR parameters", e); // NOI18N |
| 117 | + } |
| 118 | + |
| 119 | + return properties; |
| 120 | + } |
| 121 | + |
| 122 | + private static String decode(String value) { |
| 123 | + value = value.replace("%27", "\'"); // NOI18N |
| 124 | + value = value.replace("%22", "\""); // NOI18N |
| 125 | + value = value.replace("%20", " "); // NOI18N |
| 126 | + value = value.replace("%2C", ","); // NOI18N |
| 127 | + return value; |
| 128 | + } |
| 129 | + |
82 | 130 | }
|
0 commit comments