PrintingStepMonitor.java

  1. package org.jbehave.core.steps;

  2. import static java.util.Arrays.asList;

  3. import java.lang.annotation.Annotation;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Type;
  6. import java.util.Collections;
  7. import java.util.List;
  8. import java.util.Queue;
  9. import java.util.stream.Collectors;

  10. import org.jbehave.core.model.StepPattern;

  11. /**
  12.  * Abstract {@code StepMonitor} that prints to output which should be defined in child implementations.
  13.  */
  14. public abstract class PrintingStepMonitor implements StepMonitor {

  15.     private static final String CONVERTED_VALUE_OF_TYPE = "Converted value '%s' of type '%s' to '%s' with %s '%s'";
  16.     private static final String STEP_MATCHES_TYPE = "Step '%s' (with previous step '%s') %s type '%s' for method '%s' "
  17.             + "with annotations '%s' in steps instance '%s'";
  18.     private static final String STEP_MATCHES_PATTERN = "Step '%s' %s pattern '%s' for method '%s' with annotations '%s'"
  19.             + " in steps instance '%s'";
  20.     private static final String PERFORMING = "Performing step '%s'%s";
  21.     private static final String DRY_RUN = " (DRY RUN)";
  22.     private static final String MATCHES = "matches";
  23.     private static final String DOES_NOT_MATCH = "does not match";
  24.     private static final String USING_NAME_FOR_PARAMETER = "Using %s name '%s' for parameter position %d";
  25.     private static final String ANNOTATED = "annotated";
  26.     private static final String PARAMETER = "parameter";
  27.     private static final String TABLE_ANNOTATED = "table annotated";
  28.     private static final String TABLE_PARAMETER = "table parameter";
  29.     private static final String USING_NATURAL_ORDER_FOR_PARAMETER = "Using natural order for parameter position %d";
  30.     private static final String FOUND_PARAMETER = "Found parameter '%s' for position %d";
  31.     private static final String STEPS_CONTEXT_PARAMETER = "Found parameter '%s' from Steps Context";

  32.     @Override
  33.     public void stepMatchesType(String step, String previous, boolean matches, StepType stepType, Method method,
  34.             Object stepsInstance) {
  35.         print(STEP_MATCHES_TYPE, step, previous, matches(matches), stepType, method, getAnnotations(method),
  36.                 stepsInstance);
  37.     }

  38.     @Override
  39.     public void stepMatchesPattern(String step, boolean matches, StepPattern stepPattern, Method method,
  40.             Object stepsInstance) {
  41.         print(STEP_MATCHES_PATTERN, step, matches(matches), stepPattern, method, getAnnotations(method), stepsInstance);
  42.     }

  43.     @Override
  44.     public void convertedValueOfType(String value, Type type, Object converted, Queue<Class<?>> converterClasses) {
  45.         String classes = converterClasses.stream().map(Class::getName).collect(Collectors.joining(" -> "));
  46.         print(CONVERTED_VALUE_OF_TYPE, value, type, converted, "converters", classes);
  47.     }

  48.     @Override
  49.     public void beforePerforming(String step, boolean dryRun, Method method) {
  50.         print(PERFORMING, step, dryRun ? DRY_RUN : "");
  51.     }

  52.     @Override
  53.     public void afterPerforming(String step, boolean dryRun, Method method) {
  54.     }

  55.     @Override
  56.     public void usingAnnotatedNameForParameter(String name, int position) {
  57.         print(USING_NAME_FOR_PARAMETER, ANNOTATED, name, position);
  58.     }

  59.     @Override
  60.     public void usingParameterNameForParameter(String name, int position) {
  61.         print(USING_NAME_FOR_PARAMETER, PARAMETER, name, position);
  62.     }

  63.     @Override
  64.     public void usingTableAnnotatedNameForParameter(String name, int position) {
  65.         print(USING_NAME_FOR_PARAMETER, TABLE_ANNOTATED, name, position);
  66.     }

  67.     @Override
  68.     public void usingTableParameterNameForParameter(String name, int position) {
  69.         print(USING_NAME_FOR_PARAMETER, TABLE_PARAMETER, name, position);
  70.     }

  71.     @Override
  72.     public void usingNaturalOrderForParameter(int position) {
  73.         print(USING_NATURAL_ORDER_FOR_PARAMETER, position);
  74.     }

  75.     @Override
  76.     public void foundParameter(String parameter, int position) {
  77.         print(FOUND_PARAMETER, parameter, position);
  78.     }

  79.     @Override
  80.     public void usingStepsContextParameter(String parameter) {
  81.         print(STEPS_CONTEXT_PARAMETER, parameter);
  82.     }

  83.     protected abstract void print(String format, Object... args);

  84.     private List<Annotation> getAnnotations(Method method) {
  85.         return method != null ? asList(method.getAnnotations()) : Collections.<Annotation>emptyList();
  86.     }

  87.     private String matches(boolean matches) {
  88.         return matches ? MATCHES : DOES_NOT_MATCH;
  89.     }
  90. }