以下示例展示了一个用于正则表达式的设置控件的简单实现:
final class RegExpControl extends SettingControl {
private Pattern pattern = Pattern.compile(".*");
@Override
public void setValue(String value) {
this.pattern = Pattern.compile(value);
}
@Override
public String combine(Set<String> values) {
return String.join("|", values);
}
@Override
public String getValue() {
return pattern.toString();
}
public boolean matches(String s) {
return pattern.matcher(s).find();
}
}
setValue(String)
、getValue()
和combine(Set<String>)
方法。当多个录制同时运行时,会调用combine(Set<String>)
方法来确定使用哪个值。
设置控件必须有一个默认构造函数,以便在注册事件时调用。
要将设置控件与事件一起使用,添加一个返回boolean
值并以设置控件为参数的方法。使用@SettingDefinition
注解该方法。默认情况下,方法名将用作设置名称,但也可以使用@Name
注解来显式设置名称。如果方法返回true
,则事件将被提交。
建议setValue(String)
方法更新一个高效的数据结构,以便在提交事件时可以快速检查。
以下示例展示了如何创建一个使用上述正则表达式过滤器的事件。
abstract class HTTPRequest extends Event {
@Label("请求URI")
protected String uri;
@Label("Servlet URI过滤器")
@SettingDefinition
protected boolean uriFilter(RegExpControl regExp) {
return regExp.matches(uri);
}
}
@Label("HTTP Get请求")
class HTTPGetRequest extends HTTPRequest {
}
@Label("HTTP Post请求")
class HTTPPostRequest extends HTTPRequest {
}
class ExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
HTTPGetRequest request = new HTTPGetRequest();
request.begin();
request.uri = req.getRequestURI();
...
request.commit();
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
HTTPPostRequest request = new HTTPPostRequest();
request.begin();
request.uri = req.getRequestURI();
...
request.commit();
}
}
以下示例展示了如何通过为指定的正则表达式分配"uriFilter"
设置来筛选事件。
Recording r = new Recording();
r.enable("HTTPGetRequest").with("uriFilter", "https://www.example.com/list/.*");
r.enable("HTTPPostRequest").with("uriFilter", "https://www.example.com/login/.*");
r.start();
- 自 JDK 9 起:
- 9
- 参见:
-
Constructor Summary
-
Method Summary
-
Constructor Details
-
SettingControl
protected SettingControl()由子类构造函数调用的构造函数。
-
-
Method Details
-
combine
当多个录制同时运行时,将所有运行录制的设置值合并为一个值,设置值如何合并的语义取决于实现的设置控件,但所有录制应至少获得它们请求的所有事件。
此方法不应具有任何副作用,因为调用方可能会缓存值。此方法不应返回
null
或抛出异常。如果值对于此设置控件无效,则应忽略该值。示例:
如果设置控件表示一个阈值,并且同时有三个录制运行,设置值分别为
"10 ms"
、"8 s"
和"1 ms"
,则此方法返回"1 ms"
,因为这意味着所有录制至少获得了所有请求的数据。如果设置控件表示一组名称,并且同时有两个录制运行,设置值分别为
"Smith, Jones"
和"Jones, Williams"
,则返回值为"Smith, Jones, Williams"
,因为所有名称都将被接受。如果设置控件表示一个布尔条件,并且同时有四个录制运行,设置值分别为
"true"
、"false"
、"false"
和"incorrect"
,则此方法返回"true"
,因为所有录制至少获得了所有请求的数据。- 参数:
-
settingValues
- 值集合,不为null
- 返回:
-
要使用的值,不为
null
-
setValue
设置此设置的值。如果设置值对于此设置无效,则此方法不会抛出异常。相反,将忽略该值。
- 参数:
-
settingValue
- 字符串值,不为null
-
getValue
返回当前使用的此设置的值,不为null
。此方法返回的值可作为
setValue(String)
方法和combine(Set)
方法的参数。当注册事件时调用此方法以获取默认值。因此,在创建此类的实例后立即返回有效值非常重要。不允许返回
null
。- 返回:
-
设置值,不为
null
-