JMC-5698: Improving Duplicate Flags rule
Ken Dobson
kdobson at redhat.com
Mon Nov 19 20:26:52 UTC 2018
Hi all,
If anyone has the chance to give this a full review that would be great.
Thanks,
Ken Dobson
On Fri, Nov 9, 2018 at 12:36 PM Ken Dobson <kdobson at redhat.com> wrote:
> This is an update to the patch to add a fix to the tests.
>
> diff -r 4629e44fd8ea
> core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/dataproviders/JvmInternalsDataProvider.java
> ---
> a/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/dataproviders/JvmInternalsDataProvider.java
> Thu Nov 08 12:45:05 2018 +0100
> +++
> b/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/dataproviders/JvmInternalsDataProvider.java
> Fri Nov 09 12:32:49 2018 -0500
> @@ -32,10 +32,10 @@
> */
> package org.openjdk.jmc.flightrecorder.rules.jdk.dataproviders;
>
> +import java.util.ArrayList;
> +import java.util.Collection;
> import java.util.HashMap;
> -import java.util.HashSet;
> import java.util.Map;
> -import java.util.Set;
>
> /**
> * Helper class used to share analysis of JVM related information, such
> as flags.
> @@ -43,33 +43,33 @@
> @SuppressWarnings("nls")
> public class JvmInternalsDataProvider {
>
> - private static final String[] PREFIXES = new String[] {"Xmx", "Xms",
> "Xmn", "Xss", "Xmaxjitcodesize"};
> + private static final String[] PREFIXES = new String[] {"-Xmx",
> "-Xms", "-Xmn", "-Xss", "-Xmaxjitcodesize"};
> /**
> * Options that are OK to use multiple times if different values are
> provided. Check for
> * duplicates using the full argument.
> */
> - private static final String[] VERBATIM = new String[] {"verbose",
> "-add-exports"};
> + private static final String[] VERBATIM = new String[] {"-verbose",
> "--add-exports", "--add-opens"};
> private static final Map<String, String> EQUIVALENT = new HashMap<>();
>
> static {
> - putBiMap("Xbatch", "BackgroundCompilation");
> - putBiMap("Xmaxjitcodesize", "ReservedCodeCacheSize");
> - putBiMap("Xmx", "MaxHeapSize");
> - putBiMap("Xmn", "NewSize");
> - putBiMap("Xss", "ThreadStackSize");
> - putBiMap("Xusealtsigs", "UseAltSigs");
> - putBiMap("cp", "classpath");
> - putBiMap("esa", "enablesystemassertions");
> - putBiMap("dsa", "disablesystemassertions");
> - putBiMap("Xconcgc", "UseConcMarkSweepGC");
> - putBiMap("Xnoconcgc", "UseConcMarkSweepGC");
> - putBiMap("Xnoclassgc", "ClassUnloading");
> - putBiMap("Xminf", "MinHeapFreeRatio");
> - putBiMap("Xmaxf", "MaxHeapFreeRatio");
> - putBiMap("Xrs", "ReduceSignalUsage");
> - putBiMap("Dcom.sun.management", "ManagementServer");
> - putBiMap("Xshare:dump", "DumpSharedSpaces");
> - putBiMap("Xboundthreads", "UseBoundThreads");
> + putBiMap("-Xbatch", "BackgroundCompilation");
> + putBiMap("-Xmaxjitcodesize", "ReservedCodeCacheSize");
> + putBiMap("-Xmx", "MaxHeapSize");
> + putBiMap("-Xmn", "NewSize");
> + putBiMap("-Xss", "ThreadStackSize");
> + putBiMap("-Xusealtsigs", "UseAltSigs");
> + putBiMap("-cp", "classpath");
> + putBiMap("-esa", "enablesystemassertions");
> + putBiMap("-dsa", "disablesystemassertions");
> + putBiMap("-Xconcgc", "UseConcMarkSweepGC");
> + putBiMap("-Xnoconcgc", "UseConcMarkSweepGC");
> + putBiMap("-Xnoclassgc", "ClassUnloading");
> + putBiMap("-Xminf", "MinHeapFreeRatio");
> + putBiMap("-Xmaxf", "MaxHeapFreeRatio");
> + putBiMap("-Xrs", "ReduceSignalUsage");
> + putBiMap("-Dcom.sun.management", "ManagementServer");
> + putBiMap("-Xshare:dump", "DumpSharedSpaces");
> + putBiMap("-Xboundthreads", "UseBoundThreads");
> putBiMap("AlwaysTenure", "NeverTenure");
> putBiMap("ResizeTLE", "ResizeTLAB");
> putBiMap("PrintTLE", "PrintTLAB");
> @@ -77,10 +77,10 @@
> putBiMap("UseTLE", "UseTLAB");
> putBiMap("UsePermISM", "UseISM");
> putBiMap("G1MarkStackSize", "CMSMarkStackSize");
> - putBiMap("Xms", "InitialHeapSize");
> + putBiMap("-Xms", "InitialHeapSize");
> putBiMap("DisplayVMOutputToStderr", "DisplayVMOutputToStdout");
> - putBiMap("Xverify", "BytecodeVerificationLocal");
> - putBiMap("Xverify", "BytecodeVerificationRemote");
> + putBiMap("-Xverify", "BytecodeVerificationLocal");
> + putBiMap("-Xverify", "BytecodeVerificationRemote");
> putBiMap("DefaultMaxRAMFraction", "MaxRAMFraction");
> putBiMap("CMSMarkStackSizeMax", "MarkStackSizeMax");
> putBiMap("ParallelMarkingThreads", "ConcGCThreads");
> @@ -100,14 +100,13 @@
> * the set of JVM flags to check
> * @return a set of all duplicated JVM flags
> */
> - public static Set<String> checkDuplicates(String arguments) {
> - HashSet<String> seenFlags = new HashSet<>();
> - HashSet<String> dupes = new HashSet<>();
> - String[] argumentArray = arguments.split(" -");
> + public static Collection<ArrayList<String>> checkDuplicates(String
> arguments) {
> + HashMap<String, String> seenFlags = new HashMap<>();
> + HashMap<String, ArrayList<String>> dupes = new HashMap<>();
> + String[] argumentArray = arguments.split(" ");
> if (argumentArray.length == 1 && argumentArray[0].equals("")) {
> - return dupes;
> + return dupes.values();
> }
> - argumentArray[0] = argumentArray[0].substring(1);
> for (String fullArgument : argumentArray) {
> boolean verbatim = false;
> for (int i = 0; i < VERBATIM.length; i++) {
> @@ -122,7 +121,7 @@
> } else {
> String[] split = fullArgument.split("[=:]", 3);
> argument = split[0];
> - if ("XX".equals(split[0])) {
> + if ("-XX".equals(split[0])) {
> argument = split[1];
> if (argument.startsWith("+") ||
> argument.startsWith("-")) {
> argument = argument.substring(1);
> @@ -132,22 +131,24 @@
> argument = scrubPrefix(argument, PREFIXES[i]);
> }
> String equivalentArgument = EQUIVALENT.get(argument);
> - if (equivalentArgument != null &&
> !seenFlags.contains(argument)
> - && seenFlags.contains(equivalentArgument)) {
> - String longerArgument = equivalentArgument.length() >
> argument.length() ? equivalentArgument
> - : argument;
> - String shorterArgument = equivalentArgument.length()
> > argument.length() ? argument
> - : equivalentArgument;
> - String combinedArgument = String.format("%s (%s)",
> longerArgument, shorterArgument);
> - dupes.add(combinedArgument);
> + if (equivalentArgument != null &&
> !seenFlags.containsKey(argument)
> + && seenFlags.containsKey(equivalentArgument)) {
> + argument = equivalentArgument;
> }
> }
> - if (seenFlags.contains(argument)) {
> - dupes.add(argument);
> + if (seenFlags.containsKey(argument)) {
> + if (!dupes.containsKey(argument)) {
> + dupes.put(argument, new ArrayList<String>());
> + dupes.get(argument).add(seenFlags.get(argument));
> + }
> + dupes.get(argument).add(fullArgument);
> +
> }
> - seenFlags.add(argument);
> + else {
> + seenFlags.put(argument, fullArgument);
> + }
> }
> - return dupes;
> + return dupes.values();
> }
>
> private static String scrubPrefix(String argument, String prefix) {
> diff -r 4629e44fd8ea
> core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java
> ---
> a/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java
> Thu Nov 08 12:45:05 2018 +0100
> +++
> b/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java
> Fri Nov 09 12:32:49 2018 -0500
> @@ -33,6 +33,7 @@
> package org.openjdk.jmc.flightrecorder.rules.jdk.general;
>
> import java.text.MessageFormat;
> +import java.util.ArrayList;
> import java.util.Collection;
> import java.util.Collections;
> import java.util.Set;
> @@ -72,14 +73,15 @@
> // FIXME: Should we check if there are different jvm args in
> different chunks?
> Set<String> args =
> jvmInfoItems.getAggregate(Aggregators.distinct(JdkAttributes.JVM_ARGUMENTS));
> if (args != null && !args.isEmpty()) {
> -
> - Set<String> dupes =
> JvmInternalsDataProvider.checkDuplicates(args.iterator().next());
> +
> + Collection<ArrayList<String>> dupes =
> JvmInternalsDataProvider.
> + checkDuplicates(args.iterator().next());
>
> if (!dupes.isEmpty()) {
> StringBuilder sb = new StringBuilder();
> sb.append("<ul>"); //$NON-NLS-1$
> - for (String dupe : dupes) {
> - sb.append("<li>" + Encode.forHtml(dupe) + "</li>");
> //$NON-NLS-1$ //$NON-NLS-2$
> + for (ArrayList<String> dupe : dupes) {
> + sb.append("<li>" + Encode.forHtml(String.join(", ",
> dupe)) + "</li>"); //$NON-NLS-1$ //$NON-NLS-2$
> }
> sb.append("</ul>"); //$NON-NLS-1$
> String shortDescription = dupes.size() > 1
> diff -r 4629e44fd8ea
> core/tests/org.openjdk.jmc.flightrecorder.rules.jdk.test/src/test/resources/baseline/JfrRuleBaseline.xml
> ---
> a/core/tests/org.openjdk.jmc.flightrecorder.rules.jdk.test/src/test/resources/baseline/JfrRuleBaseline.xml
> Thu Nov 08 12:45:05 2018 +0100
> +++
> b/core/tests/org.openjdk.jmc.flightrecorder.rules.jdk.test/src/test/resources/baseline/JfrRuleBaseline.xml
> Fri Nov 09 12:32:49 2018 -0500
> @@ -2909,7 +2909,7 @@
> <severity>Information</severity>
> <score>50.0</score>
> <shortDescription>There were 2 JVM duplicated flags.</shortDescription>
> -<longDescription>There were 2 JVM duplicated flags. Duplicated JVM flags
> may be caused by multiple layers of scripts used when launching the
> application. Having duplicate flags is dangerous as changing one of the
> flags in one of the scripts may not have the intended effect. This can be
> especially dangerous for security related system properties. Try to find
> all the places where the flag is defined and keep only one. The following
> flags were duplicated:
> <ul><li>Xverify</li><li>Djava.endorsed.dirs</li></ul></longDescription>
> +<longDescription>There were 2 JVM duplicated flags. Duplicated JVM flags
> may be caused by multiple layers of scripts used when launching the
> application. Having duplicate flags is dangerous as changing one of the
> flags in one of the scripts may not have the intended effect. This can be
> especially dangerous for security related system properties. Try to find
> all the places where the flag is defined and keep only one. The following
> flags were duplicated:
> <ul><li>-Djava.endorsed.dirs=c:\java\JDK18~1.0_6\jre\lib\endorsed;C:\tmp\WLS-JFR\oracle_common\modules\endorsed,
> -Djava.endorsed.dirs=c:\java\JDK18~1.0_6\jre\lib\endorsed;C:\tmp\WLS-JFR\oracle_common\modules\endorsed</li><li>-Xverify:none,
> -Xverify:none</li></ul></longDescription>
> </rule>
> <rule>
> <id>Errors</id>
> @@ -3305,8 +3305,8 @@
> <id>DuplicateFlags</id>
> <severity>Information</severity>
> <score>50.0</score>
> -<shortDescription>There were 6 JVM duplicated flags.</shortDescription>
> -<longDescription>There were 6 JVM duplicated flags. Duplicated JVM flags
> may be caused by multiple layers of scripts used when launching the
> application. Having duplicate flags is dangerous as changing one of the
> flags in one of the scripts may not have the intended effect. This can be
> especially dangerous for security related system properties. Try to find
> all the places where the flag is defined and keep only one. The following
> flags were duplicated:
> <ul><li>Xmx</li><li>NewSize</li><li>Dweblogic.home</li><li>-add-opens</li><li>MaxNewSize</li><li>Xms</li></ul></longDescription>
> +<shortDescription>There were 5 JVM duplicated flags.</shortDescription>
> +<longDescription>There were 5 JVM duplicated flags. Duplicated JVM flags
> may be caused by multiple layers of scripts used when launching the
> application. Having duplicate flags is dangerous as changing one of the
> flags in one of the scripts may not have the intended effect. This can be
> especially dangerous for security related system properties. Try to find
> all the places where the flag is defined and keep only one. The following
> flags were duplicated: <ul><li>-XX:NewSize=65m,
> -XX:NewSize=65m</li><li>-Dweblogic.home=C:\weblogic\src122130_build\Oracle_Home\wlserver/server,
> -Dweblogic.home=C:\weblogic\SRC122~1\ORACLE~1\wlserver\server</li><li>-Xmx500m,
> -Xmx500m</li><li>-Xms160m,
> -Xms160m</li><li>-XX:MaxNewSize=65m,
> -XX:MaxNewSize=65m</li></ul></longDescription>
> </rule>
> <rule>
> <id>Errors</id>
>
> On Thu, Nov 8, 2018 at 4:51 PM Marcus Hirt <marcus.hirt at oracle.com> wrote:
>
>> Hi Ken,
>>
>> I took a quick look, and it looks fine to me. If someone else could
>> take a closer look, that would be great!
>>
>> Kind regards,
>> Marcus
>>
>> On 2018-11-08, 22:11, "jmc-dev on behalf of Ken Dobson" <
>> jmc-dev-bounces at openjdk.java.net on behalf of kdobson at redhat.com> wrote:
>>
>> Hi all,
>>
>> This is a patch to improve the output of the Duplicate Flags rule to
>> be
>> more clear. I've attached a screenshot showing the new output. Please
>> review it and let me know if you have any comments.
>>
>> https://bugs.openjdk.java.net/projects/JMC/issues/JMC-5698
>>
>> Thanks,
>>
>> Ken Dobson
>>
>> diff -r b3a23786ef23
>>
>> core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/dataproviders/JvmInternalsDataProvider.java
>> ---
>>
>> a/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/dataproviders/JvmInternalsDataProvider.java
>> Wed Oct 10 16:43:35 2018 -0400
>> +++
>>
>> b/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/dataproviders/JvmInternalsDataProvider.java
>> Thu Nov 08 14:31:12 2018 -0500
>> @@ -32,10 +32,10 @@
>> */
>> package org.openjdk.jmc.flightrecorder.rules.jdk.dataproviders;
>>
>> +import java.util.ArrayList;
>> +import java.util.Collection;
>> import java.util.HashMap;
>> -import java.util.HashSet;
>> import java.util.Map;
>> -import java.util.Set;
>>
>> /**
>> * Helper class used to share analysis of JVM related information,
>> such as
>> flags.
>> @@ -43,33 +43,33 @@
>> @SuppressWarnings("nls")
>> public class JvmInternalsDataProvider {
>>
>> - private static final String[] PREFIXES = new String[] {"Xmx",
>> "Xms",
>> "Xmn", "Xss", "Xmaxjitcodesize"};
>> + private static final String[] PREFIXES = new String[] {"-Xmx",
>> "-Xms",
>> "-Xmn", "-Xss", "-Xmaxjitcodesize"};
>> /**
>> * Options that are OK to use multiple times if different values
>> are
>> provided. Check for
>> * duplicates using the full argument.
>> */
>> - private static final String[] VERBATIM = new String[] {"verbose",
>> "-add-exports"};
>> + private static final String[] VERBATIM = new String[]
>> {"-verbose",
>> "--add-exports", "--add-opens"};
>> private static final Map<String, String> EQUIVALENT = new
>> HashMap<>();
>>
>> static {
>> - putBiMap("Xbatch", "BackgroundCompilation");
>> - putBiMap("Xmaxjitcodesize", "ReservedCodeCacheSize");
>> - putBiMap("Xmx", "MaxHeapSize");
>> - putBiMap("Xmn", "NewSize");
>> - putBiMap("Xss", "ThreadStackSize");
>> - putBiMap("Xusealtsigs", "UseAltSigs");
>> - putBiMap("cp", "classpath");
>> - putBiMap("esa", "enablesystemassertions");
>> - putBiMap("dsa", "disablesystemassertions");
>> - putBiMap("Xconcgc", "UseConcMarkSweepGC");
>> - putBiMap("Xnoconcgc", "UseConcMarkSweepGC");
>> - putBiMap("Xnoclassgc", "ClassUnloading");
>> - putBiMap("Xminf", "MinHeapFreeRatio");
>> - putBiMap("Xmaxf", "MaxHeapFreeRatio");
>> - putBiMap("Xrs", "ReduceSignalUsage");
>> - putBiMap("Dcom.sun.management", "ManagementServer");
>> - putBiMap("Xshare:dump", "DumpSharedSpaces");
>> - putBiMap("Xboundthreads", "UseBoundThreads");
>> + putBiMap("-Xbatch", "BackgroundCompilation");
>> + putBiMap("-Xmaxjitcodesize", "ReservedCodeCacheSize");
>> + putBiMap("-Xmx", "MaxHeapSize");
>> + putBiMap("-Xmn", "NewSize");
>> + putBiMap("-Xss", "ThreadStackSize");
>> + putBiMap("-Xusealtsigs", "UseAltSigs");
>> + putBiMap("-cp", "classpath");
>> + putBiMap("-esa", "enablesystemassertions");
>> + putBiMap("-dsa", "disablesystemassertions");
>> + putBiMap("-Xconcgc", "UseConcMarkSweepGC");
>> + putBiMap("-Xnoconcgc", "UseConcMarkSweepGC");
>> + putBiMap("-Xnoclassgc", "ClassUnloading");
>> + putBiMap("-Xminf", "MinHeapFreeRatio");
>> + putBiMap("-Xmaxf", "MaxHeapFreeRatio");
>> + putBiMap("-Xrs", "ReduceSignalUsage");
>> + putBiMap("-Dcom.sun.management", "ManagementServer");
>> + putBiMap("-Xshare:dump", "DumpSharedSpaces");
>> + putBiMap("-Xboundthreads", "UseBoundThreads");
>> putBiMap("AlwaysTenure", "NeverTenure");
>> putBiMap("ResizeTLE", "ResizeTLAB");
>> putBiMap("PrintTLE", "PrintTLAB");
>> @@ -77,10 +77,10 @@
>> putBiMap("UseTLE", "UseTLAB");
>> putBiMap("UsePermISM", "UseISM");
>> putBiMap("G1MarkStackSize", "CMSMarkStackSize");
>> - putBiMap("Xms", "InitialHeapSize");
>> + putBiMap("-Xms", "InitialHeapSize");
>> putBiMap("DisplayVMOutputToStderr",
>> "DisplayVMOutputToStdout");
>> - putBiMap("Xverify", "BytecodeVerificationLocal");
>> - putBiMap("Xverify", "BytecodeVerificationRemote");
>> + putBiMap("-Xverify", "BytecodeVerificationLocal");
>> + putBiMap("-Xverify", "BytecodeVerificationRemote");
>> putBiMap("DefaultMaxRAMFraction", "MaxRAMFraction");
>> putBiMap("CMSMarkStackSizeMax", "MarkStackSizeMax");
>> putBiMap("ParallelMarkingThreads", "ConcGCThreads");
>> @@ -100,14 +100,13 @@
>> * the set of JVM flags to check
>> * @return a set of all duplicated JVM flags
>> */
>> - public static Set<String> checkDuplicates(String arguments) {
>> - HashSet<String> seenFlags = new HashSet<>();
>> - HashSet<String> dupes = new HashSet<>();
>> - String[] argumentArray = arguments.split(" -");
>> + public static Collection<ArrayList<String>>
>> checkDuplicates(String
>> arguments) {
>> + HashMap<String, String> seenFlags = new HashMap<>();
>> + HashMap<String, ArrayList<String>> dupes = new HashMap<>();
>> + String[] argumentArray = arguments.split(" ");
>> if (argumentArray.length == 1 &&
>> argumentArray[0].equals("")) {
>> - return dupes;
>> + return dupes.values();
>> }
>> - argumentArray[0] = argumentArray[0].substring(1);
>> for (String fullArgument : argumentArray) {
>> boolean verbatim = false;
>> for (int i = 0; i < VERBATIM.length; i++) {
>> @@ -122,7 +121,7 @@
>> } else {
>> String[] split = fullArgument.split("[=:]", 3);
>> argument = split[0];
>> - if ("XX".equals(split[0])) {
>> + if ("-XX".equals(split[0])) {
>> argument = split[1];
>> if (argument.startsWith("+") ||
>> argument.startsWith("-")) {
>> argument = argument.substring(1);
>> @@ -132,22 +131,24 @@
>> argument = scrubPrefix(argument, PREFIXES[i]);
>> }
>> String equivalentArgument = EQUIVALENT.get(argument);
>> - if (equivalentArgument != null &&
>> !seenFlags.contains(argument)
>> - && seenFlags.contains(equivalentArgument)) {
>> - String longerArgument =
>> equivalentArgument.length() >
>> argument.length() ? equivalentArgument
>> - : argument;
>> - String shorterArgument =
>> equivalentArgument.length() >
>> argument.length() ? argument
>> - : equivalentArgument;
>> - String combinedArgument = String.format("%s
>> (%s)",
>> longerArgument, shorterArgument);
>> - dupes.add(combinedArgument);
>> + if (equivalentArgument != null &&
>> !seenFlags.containsKey(argument)
>> + &&
>> seenFlags.containsKey(equivalentArgument)) {
>> + argument = equivalentArgument;
>> }
>> }
>> - if (seenFlags.contains(argument)) {
>> - dupes.add(argument);
>> + if (seenFlags.containsKey(argument)) {
>> + if (!dupes.containsKey(argument)) {
>> + dupes.put(argument, new ArrayList<String>());
>> + dupes.get(argument).add(seenFlags.get(argument));
>> + }
>> + dupes.get(argument).add(fullArgument);
>> +
>> }
>> - seenFlags.add(argument);
>> + else {
>> + seenFlags.put(argument, fullArgument);
>> + }
>> }
>> - return dupes;
>> + return dupes.values();
>> }
>>
>> private static String scrubPrefix(String argument, String
>> prefix) {
>> diff -r b3a23786ef23
>>
>> core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java
>> ---
>>
>> a/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java
>> Wed Oct 10 16:43:35 2018 -0400
>> +++
>>
>> b/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java
>> Thu Nov 08 14:31:12 2018 -0500
>> @@ -33,6 +33,7 @@
>> package org.openjdk.jmc.flightrecorder.rules.jdk.general;
>>
>> import java.text.MessageFormat;
>> +import java.util.ArrayList;
>> import java.util.Collection;
>> import java.util.Collections;
>> import java.util.Set;
>> @@ -72,14 +73,15 @@
>> // FIXME: Should we check if there are different jvm args in
>> different chunks?
>> Set<String> args =
>>
>> jvmInfoItems.getAggregate(Aggregators.distinct(JdkAttributes.JVM_ARGUMENTS));
>> if (args != null && !args.isEmpty()) {
>> -
>> - Set<String> dupes =
>> JvmInternalsDataProvider.checkDuplicates(args.iterator().next());
>> +
>> + Collection<ArrayList<String>> dupes =
>> JvmInternalsDataProvider.
>> + checkDuplicates(args.iterator().next());
>>
>> if (!dupes.isEmpty()) {
>> StringBuilder sb = new StringBuilder();
>> sb.append("<ul>"); //$NON-NLS-1$
>> - for (String dupe : dupes) {
>> - sb.append("<li>" + Encode.forHtml(dupe) +
>> "</li>");
>> //$NON-NLS-1$ //$NON-NLS-2$
>> + for (ArrayList<String> dupe : dupes) {
>> + sb.append("<li>" + Encode.forHtml(String.join(",
>> ",
>> dupe)) + "</li>"); //$NON-NLS-1$ //$NON-NLS-2$
>> }
>> sb.append("</ul>"); //$NON-NLS-1$
>> String shortDescription = dupes.size() > 1
>>
>>
>>
>>
>>
More information about the jmc-dev
mailing list