in core/org.openjdk.jmc.flightrecorder.rules/src/main/java/org/openjdk/jmc/flightrecorder/rules/report/JfrRulesReport.java [241:336]
public static void addReport(String fileName, Severity minSeverity, boolean verbose, Element parent) {
try {
File file = new File(fileName);
Element reportNode = parent.getOwnerDocument().createElement("report"); //$NON-NLS-1$
parent.appendChild(reportNode);
reportNode.appendChild(createValueNode(parent.getOwnerDocument(), "file", fileName)); //$NON-NLS-1$
IItemCollection events = null;
try {
events = JfrLoaderToolkit.loadEvents(file);
} catch (IOException | CouldNotLoadRecordingException e) {
addError(parent, reportNode, e);
return;
}
// TODO: Provide configuration
Map<IRule, Future<Result>> resultFutures = RulesToolkit.evaluateParallel(RuleRegistry.getRules(), events,
null, 0);
List<Map.Entry<IRule, Future<Result>>> resultFutureList = new ArrayList<>(resultFutures.entrySet());
Collections.sort(resultFutureList, new Comparator<Map.Entry<IRule, ?>>() {
@Override
public int compare(Entry<IRule, ?> o1, Entry<IRule, ?> o2) {
return o1.getKey().getId().compareTo(o2.getKey().getId());
}
});
for (Map.Entry<IRule, Future<Result>> resultEntry : resultFutureList) {
Result result = null;
try {
result = resultEntry.getValue().get();
} catch (Throwable t) {
Element ruleNode = createRuleNode(parent, reportNode, resultEntry.getKey());
addError(parent, ruleNode, t);
continue;
}
if (result != null && Severity.get(result.getScore()).compareTo(minSeverity) >= 0) {
Element ruleNode = createRuleNode(parent, reportNode, result.getRule());
ruleNode.appendChild(createValueNode(parent.getOwnerDocument(), "severity", //$NON-NLS-1$
Severity.get(result.getScore()).getLocalizedName()));
ruleNode.appendChild(
createValueNode(parent.getOwnerDocument(), "score", String.valueOf(result.getScore()))); //$NON-NLS-1$
ruleNode.appendChild(
createValueNode(parent.getOwnerDocument(), "message", result.getShortDescription())); //$NON-NLS-1$
if (verbose) {
ruleNode.appendChild(createValueNode(parent.getOwnerDocument(), "detailedmessage", //$NON-NLS-1$
result.getLongDescription()));
}
IItemQuery itemQuery = result.getItemQuery();
if (verbose && itemQuery != null && !itemQuery.getAttributes().isEmpty()) {
Element itemSetNode = parent.getOwnerDocument().createElement("itemset"); //$NON-NLS-1$
ruleNode.appendChild(itemSetNode);
IItemCollection resultEvents = events.apply(itemQuery.getFilter());
Collection<? extends IAttribute<?>> attributes = itemQuery.getAttributes();
Element fieldsNode = parent.getOwnerDocument().createElement("fields"); //$NON-NLS-1$
itemSetNode.appendChild(fieldsNode);
for (IAttribute<?> attribute : attributes) {
Element fieldNode = parent.getOwnerDocument().createElement("field"); //$NON-NLS-1$
fieldsNode.appendChild(fieldNode);
fieldNode.appendChild(
createValueNode(parent.getOwnerDocument(), "name", attribute.getName())); //$NON-NLS-1$
}
Element itemsNode = parent.getOwnerDocument().createElement("items"); //$NON-NLS-1$
itemSetNode.appendChild(itemsNode);
Iterator<? extends IItemIterable> iterables = resultEvents.iterator();
while (iterables.hasNext()) {
IItemIterable ii = iterables.next();
IType<IItem> type = ii.getType();
List<IMemberAccessor<?, IItem>> accessors = new ArrayList<>(attributes.size());
for (IAttribute<?> a : attributes) {
accessors.add(a.getAccessor(type));
}
Iterator<? extends IItem> items = ii.iterator();
while (items.hasNext()) {
IItem item = items.next();
Element itemNode = parent.getOwnerDocument().createElement("item"); //$NON-NLS-1$
itemsNode.appendChild(itemNode);
for (IMemberAccessor<?, IItem> a : accessors) {
itemNode.appendChild(createValueNode(parent.getOwnerDocument(), "value", //$NON-NLS-1$
toString(a.getMember(item))));
}
}
}
}
}
}
} catch (Throwable t) {
System.err.println("Got exception when creating report for " + fileName); //$NON-NLS-1$
throw t;
}
}