diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlElement.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlElement.java index d05516ed2291a..e2d40a635aaa0 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlElement.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -107,6 +107,13 @@ final String getContent() { return content; } + final String getContentOrEmptyQuote() { + if (content == null || content.isEmpty()) { + return "\"\""; + } + return content; + } + final void addListener(XmlElement listener) { listeners.add(listener); listener.addProducer(this); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlText.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlText.java index 4d90dd3c51ceb..9eedf59d4bc86 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlText.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlText.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,8 @@ */ package jdk.jfr.internal.jfc.model; +import jdk.jfr.internal.tracing.Filter; + // Corresponds to final class XmlText extends XmlInput { @@ -35,7 +37,7 @@ public String getOptionSyntax() { sb.append(getContentType().orElse("text")); sb.append(">"); sb.append(" ("); - String content = getContent(); + String content = getContentOrEmptyQuote(); if (isTimespan()) { // "20 ms" becomes "20ms" content = content.replaceAll("\\s", ""); @@ -57,7 +59,7 @@ public void configure(String value) { @Override public void configure(UserInterface ui) throws AbortException { ui.println(); - ui.println(getLabel() + ": " + getContent() + " (default)"); + ui.println(getLabel() + ": " + getContentOrEmptyQuote() + " (default)"); while (!readInput(ui)) { ; } @@ -71,9 +73,21 @@ protected Result evaluate() { private boolean readInput(UserInterface ui) throws AbortException { String line = ui.readLine(); if (line.isBlank()) { - ui.println("Using default: " + getContent()); + ui.println("Using default: " + getContentOrEmptyQuote()); return true; } + if (isMethodFilter()) { + if (!Filter.isValid(line)) { + ui.println(""" + Not a valid method filter. A filter can be an annotation \ + (@jakarta.ws.rs.GET), a full qualified class name (com.example.Foo), \ + a fully qualified method reference (java.lang.HashMap::resize) or a \ + class initializer (::). Use for constructors. \ + Separate multiple filters with semicolon.\ + """); + return false; + } + } if (isTimespan()) { try { line = Utilities.parseTimespan(line); @@ -90,4 +104,8 @@ private boolean readInput(UserInterface ui) throws AbortException { private boolean isTimespan() { return getContentType().orElse("text").equals("timespan"); } + + private boolean isMethodFilter() { + return getContentType().orElse("text").equals("method-filter"); + } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/MethodSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/MethodSetting.java index f4f3d93c01cef..f3e1069ca2144 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/MethodSetting.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/MethodSetting.java @@ -33,6 +33,7 @@ import jdk.jfr.internal.PlatformEventType; import jdk.jfr.internal.Type; import jdk.jfr.internal.tracing.Modification; +import jdk.jfr.internal.tracing.Filter; import jdk.jfr.internal.tracing.PlatformTracer; @MetadataDefinition @@ -47,8 +48,9 @@ public MethodSetting(PlatformEventType eventType, Modification modification, Str this.modification = modification; } + @Override public boolean isValid(String text) { - return PlatformTracer.isValidFilter(text); + return Filter.isValid(text); } @Override diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/Filter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/Filter.java index 782cc3e56d1d1..177b6d03166d0 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/Filter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/Filter.java @@ -30,7 +30,11 @@ * Class that represents the filter a user can specify for the MethodTrace and * MethodTiming event. */ -record Filter(String className, String methodName, String annotationName, Modification modification) { +public record Filter(String className, String methodName, String annotationName, Modification modification) { + + public static boolean isValid(String filter) { + return of(filter, Modification.NONE) != null; + } static Filter of(String filter, Modification modification) { if (filter.startsWith("@")) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/PlatformTracer.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/PlatformTracer.java index abc3b0f8cd07c..5985b28b58e2e 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/PlatformTracer.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tracing/PlatformTracer.java @@ -158,10 +158,6 @@ public static void addTiming(long id, long duration) { } } - public static boolean isValidFilter(String text) { - return Filter.of(text, null) != null; - } - public static void setFilters(Modification modification, List filters) { ensureInitialized(); publishClasses(applyFilter(modification, filters)); diff --git a/src/jdk.jfr/share/conf/jfr/default.jfc b/src/jdk.jfr/share/conf/jfr/default.jfc index 565dfbdee0531..200518648957a 100644 --- a/src/jdk.jfr/share/conf/jfr/default.jfc +++ b/src/jdk.jfr/share/conf/jfr/default.jfc @@ -1189,9 +1189,11 @@ 20 ms - + - + false diff --git a/src/jdk.jfr/share/conf/jfr/profile.jfc b/src/jdk.jfr/share/conf/jfr/profile.jfc index 2c0812e75fedf..5ffdc8d9e4dbf 100644 --- a/src/jdk.jfr/share/conf/jfr/profile.jfc +++ b/src/jdk.jfr/share/conf/jfr/profile.jfc @@ -1188,9 +1188,11 @@ 10 ms - + - + false