in core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/latency/BiasedLockingRevocationRule.java [108:192]
private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) {
EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items,
JdkTypeIDs.BIASED_LOCK_CLASS_REVOCATION);
if (eventAvailability == EventAvailability.UNKNOWN || eventAvailability == EventAvailability.DISABLED) {
return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability,
JdkTypeIDs.BIASED_LOCK_CLASS_REVOCATION);
}
IItemCollection revokationEvents = items.apply(JdkFilters.BIASED_LOCKING_REVOCATIONS); // $NON-NLS-1$
if (!revokationEvents.hasItems()) {
return new Result(this, 0, Messages.getString(Messages.BiasedLockingRevocationPauseRule_TEXT_OK));
}
Set<String> filteredTypes = getFilteredTypes(valueProvider.getPreferenceValue(FILTERED_CLASSES));
IItemCollection revokedClassesEvents = revokationEvents
.apply(ItemFilters.and(ItemFilters.hasAttribute(JdkAttributes.BIASED_REVOCATION_CLASS),
ItemFilters.equals(JdkAttributes.BIASED_REVOCATION_DISABLE_BIASING, Boolean.TRUE)));
Set<IMCType> revokedTypes = filter(filteredTypes,
revokedClassesEvents.getAggregate(Aggregators.distinct(JdkAttributes.BIASED_REVOCATION_CLASS)));
StringBuilder shortMessage = new StringBuilder();
StringBuilder longMessage = new StringBuilder();
float totalScore = 0;
if (!revokedTypes.isEmpty()) {
totalScore = 25; // Base penalty for having fully revoked types not filtered out.
totalScore += RulesToolkit.mapExp(revokedTypes.size(), 25, 7, 20); // Up to 25 more points if you have plenty of revoked types.
shortMessage.append(Messages.getString(Messages.BiasedLockingRevocationRule_TEXT_REVOKED_CLASSES_FOUND));
shortMessage.append(" "); //$NON-NLS-1$
longMessage
.append(Messages.getString(Messages.BiasedLockingRevocationRule_TEXT_REVOKED_CLASSES_FOUND_LONG));
longMessage.append("<p><ul>"); //$NON-NLS-1$
for (IMCType offender : revokedTypes) {
longMessage.append("<li>"); //$NON-NLS-1$
longMessage.append(offender.toString());
longMessage.append("</li>"); //$NON-NLS-1$
}
longMessage.append("</ul></p>"); //$NON-NLS-1$
}
int warningLimit = (int) valueProvider.getPreferenceValue(WARNING_LIMIT).longValue();
Map<IMCType, ClassEntry> revocationMap = extractRevocations(revokationEvents,
ItemFilters.or(ItemFilters.type(JdkTypeIDs.BIASED_LOCK_REVOCATION),
ItemFilters.type(JdkTypeIDs.BIASED_LOCK_SELF_REVOCATION)),
JdkAttributes.BIASED_REVOCATION_LOCK_CLASS);
Map<IMCType, ClassEntry> classRevocationMap = extractRevocations(revokationEvents,
ItemFilters.type(JdkTypeIDs.BIASED_LOCK_CLASS_REVOCATION), JdkAttributes.BIASED_REVOCATION_CLASS);
List<ClassEntry> revocationClasses = filteredMerge(filteredTypes, revokedTypes, classRevocationMap,
revocationMap);
totalScore += calculateRevocationCountScore(revocationClasses);
Collections.sort(revocationClasses);
if (revocationClasses.size() > 0) {
int maxClasses = (int) valueProvider.getPreferenceValue(MAX_NUMBER_OF_CLASSES_TO_REPORT).longValue();
shortMessage
.append(Messages.getString(Messages.BiasedLockingRevocationRule_TEXT_REVOKE_LIMIT_CLASSES_FOUND));
longMessage.append(MessageFormat.format(
Messages.getString(Messages.BiasedLockingRevocationRule_TEXT_REVOKE_LIMIT_CLASSES_FOUND_LONG),
warningLimit));
longMessage.append("<p><ul>"); //$NON-NLS-1$
int classLimit = Math.min(revocationClasses.size(), maxClasses);
for (int i = 0; i < classLimit; i++) {
ClassEntry classEntry = revocationClasses.get(i);
if (classEntry.getCount() < warningLimit) {
break;
}
longMessage.append("<li>"); //$NON-NLS-1$
longMessage.append(classEntry);
longMessage.append("</li>"); //$NON-NLS-1$
}
longMessage.append("</ul></p>"); //$NON-NLS-1$
}
if (totalScore == 0) {
return new Result(this, 0, Messages.getString(Messages.BiasedLockingRevocationRule_TEXT_OK));
} else {
longMessage
.append(MessageFormat.format(Messages.getString(Messages.BiasedLockingRevocationRule_TEXT_EPILOGUE),
String.valueOf(filteredTypes)));
}
return new Result(this, totalScore, shortMessage.toString(), longMessage.toString());
}