1 package org.openjdk.jmc.flightrecorder.rules.jdk.exceptions;
   2 
   3 import java.util.Collection;
   4 import java.util.Collections;
   5 import java.util.concurrent.Callable;
   6 import java.util.concurrent.FutureTask;
   7 import java.util.concurrent.RunnableFuture;
   8 
   9 import org.openjdk.jmc.common.item.IItemCollection;
  10 import org.openjdk.jmc.common.item.IItemFilter;
  11 import org.openjdk.jmc.common.item.ItemFilters;
  12 import org.openjdk.jmc.common.util.IPreferenceValueProvider;
  13 import org.openjdk.jmc.common.util.TypedPreference;
  14 import org.openjdk.jmc.flightrecorder.jdk.JdkAttributes;
  15 import org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs;
  16 import org.openjdk.jmc.flightrecorder.rules.IRule;
  17 import org.openjdk.jmc.flightrecorder.rules.Result;
  18 import org.openjdk.jmc.flightrecorder.rules.jdk.messages.internal.Messages;
  19 import org.openjdk.jmc.flightrecorder.rules.util.JfrRuleTopics;
  20 import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit;
  21 import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit.EventAvailability;
  22 
  23 public class FatalErrorRule implements IRule {
  24         
  25         private static final String RESULT_ID = "Fatal Errors"; //$NON-NLS-1$
  26         
  27         private static final String ERROR_REASON = "VM Error"; //$NON-NLS-1$
  28         
  29         private FutureTask<Result> evaluationTask;
  30 
  31         @Override
  32         public RunnableFuture<Result> evaluate(final IItemCollection items, final IPreferenceValueProvider valueProvider) {
  33                 evaluationTask = new FutureTask<>(new Callable<Result>() {
  34                         @Override
  35                         public Result call() throws Exception {
  36                                 return getResult(items, valueProvider);
  37                         }
  38                 });
  39                 return evaluationTask;
  40         }
  41         
  42         private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) {
  43                 EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JdkTypeIDs.VM_SHUTDOWN);
  44                 if (eventAvailability != EventAvailability.AVAILABLE) {
  45                         return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability, JdkTypeIDs.VM_SHUTDOWN);
  46                 }
  47                 
  48                 IItemFilter fatalErrorFilter = ItemFilters.type(JdkTypeIDs.VM_SHUTDOWN);
  49                 IItemCollection errorItems = items.apply(fatalErrorFilter);
  50                 
  51                 if (errorItems.hasItems()) {
  52                         // Check the type of VM Shutdown, if it was a VM Error we should report it.
  53                         if (errorItems.apply(ItemFilters.contains(JdkAttributes.SHUTDOWN_REASON, ERROR_REASON)).hasItems()) {
  54                                 String message = Messages.getString(Messages.FatalErrorRule_TEXT_WARN);
  55                                 return new Result(this, 100, message);
  56                         }
  57                 }
  58                 
  59                 return new Result(this, 0, Messages.getString(Messages.FatalErrorRule_TEXT_OK));
  60         }
  61 
  62         @Override
  63         public Collection<TypedPreference<?>> getConfigurationAttributes() {
  64                 return Collections.emptyList();
  65         }
  66 
  67         @Override
  68         public String getId() {
  69                 return RESULT_ID;
  70         }
  71 
  72         @Override
  73         public String getName() {
  74                 return Messages.getString(Messages.FatalErrorRule_RULE_NAME);
  75         }
  76 
  77         @Override
  78         public String getTopic() {
  79                 return JfrRuleTopics.JVM_INFORMATION_TOPIC;
  80         }
  81 }