package org.oran.dmaapadapter.filter;
+import com.google.gson.annotations.Expose;
+
import java.util.ArrayList;
import java.util.Collection;
public class PmReport {
+ @Expose
Event event = new Event();
public static class CommonEventHeader {
+ @Expose
String domain;
+
+ @Expose
String eventId;
+
+ @Expose
int sequence;
+
+ @Expose
String eventName;
+
+ @Expose
String sourceName;
+
+ @Expose
String reportingEntityName;
+
+ @Expose
String priority;
+
+ @Expose
long startEpochMicrosec;
+
+ @Expose
long lastEpochMicrosec;
+
+ @Expose
String version;
+
+ @Expose
String vesEventListenerVersion;
+
+ @Expose
String timeZoneOffset;
}
public static class MeasInfoId {
- String sMeasInfoId;
+ @Expose
+ String sMeasInfoId = "";
}
public static class MeasTypes {
return sMeasTypesList.get(pValue - 1);
}
+ @Expose
protected ArrayList<String> sMeasTypesList = new ArrayList<>();
}
public static class MeasResult {
+ @Expose
int p;
- String sValue;
+
+ @Expose
+ String sValue = "";
}
public static class MeasValuesList {
+ @Expose
String measObjInstId;
+
+ @Expose
String suspectFlag;
+
+ @Expose
Collection<MeasResult> measResults = new ArrayList<>();
public MeasValuesList shallowClone() {
}
public static class MeasInfoList {
+ @Expose
MeasInfoId measInfoId;
+
+ @Expose
MeasTypes measTypes;
+
+ @Expose
Collection<MeasValuesList> measValuesList = new ArrayList<>();
public MeasInfoList shallowClone() {
}
public static class MeasDataCollection {
+ @Expose
int granularityPeriod;
+
+ @Expose
String measuredEntityUserName;
+
+ @Expose
String measuredEntityDn;
+
+ @Expose
String measuredEntitySoftwareVersion;
+
+ @Expose
Collection<MeasInfoList> measInfoList = new ArrayList<>();
}
public static class Perf3gppFields {
+ @Expose
String perf3gppFieldsVersion;
+
+ @Expose
MeasDataCollection measDataCollection;
}
public static class Event {
+ @Expose
CommonEventHeader commonEventHeader;
+
+ @Expose
Perf3gppFields perf3gppFields;
}
package org.oran.dmaapadapter.filter;
+import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import lombok.Getter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.thymeleaf.util.StringUtils;
public class PmReportFilter implements Filter {
+ private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+ private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder() //
+ .disableHtmlEscaping() //
+ .excludeFieldsWithoutExposeAnnotation() //
+ .create();
+
+ // excludeFieldsWithoutExposeAnnotation is not needed when parsing and this is a
+ // bit quicker
+ private static com.google.gson.Gson gsonParse = new com.google.gson.GsonBuilder() //
+ .disableHtmlEscaping() //
+ .create();
- private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create();
private final FilterData filterData;
@Getter
}
private static class MeasTypesIndexed extends PmReport.MeasTypes {
+
private Map<String, Integer> map = new HashMap<>();
public int addP(String measTypeName) {
if (p != null) {
return p;
} else {
- this.sMeasTypesList.add(measTypeName);
- this.map.put(measTypeName, this.sMeasTypesList.size());
- return this.sMeasTypesList.size();
+ sMeasTypesList.add(measTypeName);
+ this.map.put(measTypeName, sMeasTypesList.size());
+ return sMeasTypesList.size();
}
}
}
@Override
public String filter(String data) {
- PmReport report = gson.fromJson(data, PmReport.class);
- if (!filter(report, this.filterData)) {
+ try {
+ PmReport report = gsonParse.fromJson(data, PmReport.class);
+ if (report.event.perf3gppFields == null) {
+ logger.warn("Received PM report with no perf3gppFields, ignored. {}", data);
+ return "";
+ }
+
+ if (!filter(report, this.filterData)) {
+ return "";
+ }
+ return gson.toJson(report);
+ } catch (Exception e) {
+ logger.warn("Could not parse PM data. {}, reason: {}", data, e.getMessage());
return "";
}
- return gson.toJson(report);
}
/**
filterData.measuredEntityDns.add("ManagedElement=RNC-Gbg-1");
filter = new PmReportFilter(filterData);
filtered = filter.filter(loadReport());
- assertThat(filtered).contains("RNC-Gbg-1"); // '=' is escaped to unicode by gson. OK
+ assertThat(filtered).contains("ManagedElement=RNC-Gbg-1");
+ }
+
+ @Test
+ void testCrapInput() {
+ PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
+ PmReportFilter filter = new PmReportFilter(filterData);
+
+ String filtered = filter.filter("junk");
+ assertThat(filtered).isEmpty();
+
+ filtered = filter.filter(reQuote("{'msg': 'test'}"));
+ assertThat(filtered).isEmpty();
+
+ }
+
+ private String reQuote(String str) {
+ return str.replaceAll("'", "\\\"");
}
@Test