public static void addReport()

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;
		}
	}