Skip to content

Commit 8ca0d4b

Browse files
authored
Refactor auditor-related classes (#45893)
1 parent 38cf581 commit 8ca0d4b

File tree

12 files changed

+206
-264
lines changed

12 files changed

+206
-264
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/common/notifications/AbstractAuditMessage.java

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,59 @@
66
package org.elasticsearch.xpack.core.common.notifications;
77

88
import org.elasticsearch.common.ParseField;
9+
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
10+
import org.elasticsearch.common.xcontent.ObjectParser;
911
import org.elasticsearch.common.xcontent.ToXContent;
1012
import org.elasticsearch.common.xcontent.ToXContentObject;
1113
import org.elasticsearch.common.xcontent.XContentBuilder;
14+
import org.elasticsearch.common.xcontent.XContentParser;
15+
import org.elasticsearch.xpack.core.common.time.TimeUtils;
1216

1317
import java.io.IOException;
1418
import java.util.Date;
1519
import java.util.Objects;
1620

21+
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
22+
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.optionalConstructorArg;
23+
1724
public abstract class AbstractAuditMessage implements ToXContentObject {
18-
public static final ParseField TYPE = new ParseField("audit_message");
1925

2026
public static final ParseField MESSAGE = new ParseField("message");
2127
public static final ParseField LEVEL = new ParseField("level");
2228
public static final ParseField TIMESTAMP = new ParseField("timestamp");
2329
public static final ParseField NODE_NAME = new ParseField("node_name");
2430

31+
protected static final <T extends AbstractAuditMessage> ConstructingObjectParser<T, Void> createParser(
32+
String name, AbstractAuditMessageFactory<T> messageFactory, ParseField resourceField) {
33+
34+
ConstructingObjectParser<T, Void> PARSER = new ConstructingObjectParser<>(
35+
name,
36+
true,
37+
a -> messageFactory.newMessage((String)a[0], (String)a[1], (Level)a[2], (Date)a[3], (String)a[4]));
38+
39+
PARSER.declareString(optionalConstructorArg(), resourceField);
40+
PARSER.declareString(constructorArg(), MESSAGE);
41+
PARSER.declareField(constructorArg(), p -> {
42+
if (p.currentToken() == XContentParser.Token.VALUE_STRING) {
43+
return Level.fromString(p.text());
44+
}
45+
throw new IllegalArgumentException("Unsupported token [" + p.currentToken() + "]");
46+
}, LEVEL, ObjectParser.ValueType.STRING);
47+
PARSER.declareField(constructorArg(),
48+
p -> TimeUtils.parseTimeField(p, TIMESTAMP.getPreferredName()),
49+
TIMESTAMP,
50+
ObjectParser.ValueType.VALUE);
51+
PARSER.declareString(optionalConstructorArg(), NODE_NAME);
52+
53+
return PARSER;
54+
}
55+
2556
private final String resourceId;
2657
private final String message;
2758
private final Level level;
2859
private final Date timestamp;
2960
private final String nodeName;
3061

31-
public AbstractAuditMessage(String resourceId, String message, Level level, String nodeName) {
32-
this.resourceId = resourceId;
33-
this.message = Objects.requireNonNull(message);
34-
this.level = Objects.requireNonNull(level);
35-
this.timestamp = new Date();
36-
this.nodeName = nodeName;
37-
}
38-
3962
protected AbstractAuditMessage(String resourceId, String message, Level level, Date timestamp, String nodeName) {
4063
this.resourceId = resourceId;
4164
this.message = Objects.requireNonNull(message);
@@ -82,7 +105,7 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par
82105

83106
@Override
84107
public int hashCode() {
85-
return Objects.hash(resourceId, message, level, timestamp);
108+
return Objects.hash(resourceId, message, level, timestamp, nodeName);
86109
}
87110

88111
@Override
@@ -98,25 +121,9 @@ public boolean equals(Object obj) {
98121
return Objects.equals(resourceId, other.resourceId) &&
99122
Objects.equals(message, other.message) &&
100123
Objects.equals(level, other.level) &&
101-
Objects.equals(timestamp, other.timestamp);
124+
Objects.equals(timestamp, other.timestamp) &&
125+
Objects.equals(nodeName, other.nodeName);
102126
}
103127

104128
protected abstract String getResourceField();
105-
106-
public abstract static class AbstractBuilder<T extends AbstractAuditMessage> {
107-
108-
public T info(String resourceId, String message, String nodeName) {
109-
return newMessage(Level.INFO, resourceId, message, nodeName);
110-
}
111-
112-
public T warning(String resourceId, String message, String nodeName) {
113-
return newMessage(Level.WARNING, resourceId, message, nodeName);
114-
}
115-
116-
public T error(String resourceId, String message, String nodeName) {
117-
return newMessage(Level.ERROR, resourceId, message, nodeName);
118-
}
119-
120-
protected abstract T newMessage(Level level, String resourceId, String message, String nodeName);
121-
}
122129
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
package org.elasticsearch.xpack.core.common.notifications;
7+
8+
import java.util.Date;
9+
10+
/**
11+
* {@link AbstractAuditMessageFactory} interface provides means for creating audit messages.
12+
* @param <T> type of the audit message
13+
*/
14+
public interface AbstractAuditMessageFactory<T extends AbstractAuditMessage> {
15+
16+
T newMessage(String resourceId, String message, Level level, Date timestamp, String nodeName);
17+
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/common/notifications/AbstractAuditor.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.elasticsearch.common.xcontent.XContentBuilder;
1717

1818
import java.io.IOException;
19+
import java.util.Date;
1920
import java.util.Objects;
2021

2122
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
@@ -28,37 +29,37 @@ public abstract class AbstractAuditor<T extends AbstractAuditMessage> {
2829
private final String nodeName;
2930
private final String auditIndex;
3031
private final String executionOrigin;
31-
private final AbstractAuditMessage.AbstractBuilder<T> messageBuilder;
32+
private final AbstractAuditMessageFactory<T> messageFactory;
3233

33-
public AbstractAuditor(Client client,
34-
String nodeName,
35-
String auditIndex,
36-
String executionOrigin,
37-
AbstractAuditMessage.AbstractBuilder<T> messageBuilder) {
34+
protected AbstractAuditor(Client client,
35+
String nodeName,
36+
String auditIndex,
37+
String executionOrigin,
38+
AbstractAuditMessageFactory<T> messageFactory) {
3839
this.client = Objects.requireNonNull(client);
3940
this.nodeName = Objects.requireNonNull(nodeName);
4041
this.auditIndex = auditIndex;
4142
this.executionOrigin = executionOrigin;
42-
this.messageBuilder = Objects.requireNonNull(messageBuilder);
43+
this.messageFactory = Objects.requireNonNull(messageFactory);
4344
}
4445

4546
public void info(String resourceId, String message) {
46-
indexDoc(messageBuilder.info(resourceId, message, nodeName));
47+
indexDoc(messageFactory.newMessage(resourceId, message, Level.INFO, new Date(), nodeName));
4748
}
4849

4950
public void warning(String resourceId, String message) {
50-
indexDoc(messageBuilder.warning(resourceId, message, nodeName));
51+
indexDoc(messageFactory.newMessage(resourceId, message, Level.WARNING, new Date(), nodeName));
5152
}
5253

5354
public void error(String resourceId, String message) {
54-
indexDoc(messageBuilder.error(resourceId, message, nodeName));
55+
indexDoc(messageFactory.newMessage(resourceId, message, Level.ERROR, new Date(), nodeName));
5556
}
5657

57-
protected void onIndexResponse(IndexResponse response) {
58+
private void onIndexResponse(IndexResponse response) {
5859
logger.trace("Successfully wrote audit message");
5960
}
6061

61-
protected void onIndexFailure(Exception exception) {
62+
private void onIndexFailure(Exception exception) {
6263
logger.debug("Failed to write audit message", exception);
6364
}
6465

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/dataframe/notifications/DataFrameAuditMessage.java

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,61 +7,24 @@
77

88
import org.elasticsearch.common.ParseField;
99
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
10-
import org.elasticsearch.common.xcontent.ObjectParser;
11-
import org.elasticsearch.common.xcontent.XContentParser;
1210
import org.elasticsearch.xpack.core.common.notifications.AbstractAuditMessage;
1311
import org.elasticsearch.xpack.core.common.notifications.Level;
14-
import org.elasticsearch.xpack.core.common.time.TimeUtils;
1512
import org.elasticsearch.xpack.core.dataframe.DataFrameField;
1613

1714
import java.util.Date;
1815

19-
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
20-
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.optionalConstructorArg;
21-
2216
public class DataFrameAuditMessage extends AbstractAuditMessage {
2317

2418
private static final ParseField TRANSFORM_ID = new ParseField(DataFrameField.TRANSFORM_ID);
25-
public static final ConstructingObjectParser<DataFrameAuditMessage, Void> PARSER = new ConstructingObjectParser<>(
26-
"data_frame_audit_message",
27-
true,
28-
a -> new DataFrameAuditMessage((String)a[0], (String)a[1], (Level)a[2], (Date)a[3], (String)a[4]));
29-
30-
static {
31-
PARSER.declareString(optionalConstructorArg(), TRANSFORM_ID);
32-
PARSER.declareString(constructorArg(), MESSAGE);
33-
PARSER.declareField(constructorArg(), p -> {
34-
if (p.currentToken() == XContentParser.Token.VALUE_STRING) {
35-
return Level.fromString(p.text());
36-
}
37-
throw new IllegalArgumentException("Unsupported token [" + p.currentToken() + "]");
38-
}, LEVEL, ObjectParser.ValueType.STRING);
39-
PARSER.declareField(constructorArg(),
40-
p -> TimeUtils.parseTimeField(p, TIMESTAMP.getPreferredName()),
41-
TIMESTAMP,
42-
ObjectParser.ValueType.VALUE);
43-
PARSER.declareString(optionalConstructorArg(), NODE_NAME);
44-
}
19+
public static final ConstructingObjectParser<DataFrameAuditMessage, Void> PARSER =
20+
createParser("data_frame_audit_message", DataFrameAuditMessage::new, TRANSFORM_ID);
4521

46-
public DataFrameAuditMessage(String resourceId, String message, Level level, String nodeName) {
47-
super(resourceId, message, level, nodeName);
48-
}
49-
50-
protected DataFrameAuditMessage(String resourceId, String message, Level level, Date timestamp, String nodeName) {
22+
public DataFrameAuditMessage(String resourceId, String message, Level level, Date timestamp, String nodeName) {
5123
super(resourceId, message, level, timestamp, nodeName);
5224
}
5325

5426
@Override
5527
protected String getResourceField() {
5628
return TRANSFORM_ID.getPreferredName();
5729
}
58-
59-
public static AbstractAuditMessage.AbstractBuilder<DataFrameAuditMessage> builder() {
60-
return new AbstractBuilder<DataFrameAuditMessage>() {
61-
@Override
62-
protected DataFrameAuditMessage newMessage(Level level, String resourceId, String message, String nodeName) {
63-
return new DataFrameAuditMessage(resourceId, message, level, nodeName);
64-
}
65-
};
66-
}
6730
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/notifications/AnomalyDetectionAuditMessage.java

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,61 +5,26 @@
55
*/
66
package org.elasticsearch.xpack.core.ml.notifications;
77

8+
import org.elasticsearch.common.ParseField;
89
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
9-
import org.elasticsearch.common.xcontent.ObjectParser;
10-
import org.elasticsearch.common.xcontent.XContentParser;
1110
import org.elasticsearch.xpack.core.common.notifications.AbstractAuditMessage;
1211
import org.elasticsearch.xpack.core.common.notifications.Level;
1312
import org.elasticsearch.xpack.core.ml.job.config.Job;
14-
import org.elasticsearch.xpack.core.common.time.TimeUtils;
1513

1614
import java.util.Date;
1715

18-
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
19-
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.optionalConstructorArg;
20-
2116
public class AnomalyDetectionAuditMessage extends AbstractAuditMessage {
2217

23-
public static final ConstructingObjectParser<AnomalyDetectionAuditMessage, Void> PARSER = new ConstructingObjectParser<>(
24-
"ml_audit_message",
25-
true,
26-
a -> new AnomalyDetectionAuditMessage((String)a[0], (String)a[1], (Level)a[2], (Date)a[3], (String)a[4]));
27-
28-
static {
29-
PARSER.declareString(optionalConstructorArg(), Job.ID);
30-
PARSER.declareString(constructorArg(), MESSAGE);
31-
PARSER.declareField(constructorArg(), p -> {
32-
if (p.currentToken() == XContentParser.Token.VALUE_STRING) {
33-
return Level.fromString(p.text());
34-
}
35-
throw new IllegalArgumentException("Unsupported token [" + p.currentToken() + "]");
36-
}, LEVEL, ObjectParser.ValueType.STRING);
37-
PARSER.declareField(constructorArg(),
38-
p -> TimeUtils.parseTimeField(p, TIMESTAMP.getPreferredName()),
39-
TIMESTAMP,
40-
ObjectParser.ValueType.VALUE);
41-
PARSER.declareString(optionalConstructorArg(), NODE_NAME);
42-
}
18+
private static final ParseField JOB_ID = Job.ID;
19+
public static final ConstructingObjectParser<AnomalyDetectionAuditMessage, Void> PARSER =
20+
createParser("ml_audit_message", AnomalyDetectionAuditMessage::new, JOB_ID);
4321

44-
public AnomalyDetectionAuditMessage(String resourceId, String message, Level level, String nodeName) {
45-
super(resourceId, message, level, nodeName);
46-
}
47-
48-
protected AnomalyDetectionAuditMessage(String resourceId, String message, Level level, Date timestamp, String nodeName) {
22+
public AnomalyDetectionAuditMessage(String resourceId, String message, Level level, Date timestamp, String nodeName) {
4923
super(resourceId, message, level, timestamp, nodeName);
5024
}
5125

5226
@Override
5327
protected String getResourceField() {
54-
return Job.ID.getPreferredName();
55-
}
56-
57-
public static AbstractBuilder<AnomalyDetectionAuditMessage> builder() {
58-
return new AbstractBuilder<AnomalyDetectionAuditMessage>() {
59-
@Override
60-
protected AnomalyDetectionAuditMessage newMessage(Level level, String resourceId, String message, String nodeName) {
61-
return new AnomalyDetectionAuditMessage(resourceId, message, level, nodeName);
62-
}
63-
};
28+
return JOB_ID.getPreferredName();
6429
}
6530
}

0 commit comments

Comments
 (0)