AnnotatedEmbedderUtils.java

  1. package org.jbehave.core.junit;

  2. import org.jbehave.core.embedder.EmbedderClassLoader;
  3. import org.junit.runner.RunWith;

  4. public class AnnotatedEmbedderUtils {

  5.     public static AnnotatedEmbedderRunner annotatedEmbedderRunner(String annotatedClassName,
  6.             EmbedderClassLoader classLoader) {
  7.         Class<?> runnerClass = runnerClass(annotatedClassName, classLoader);
  8.         return newAnnotatedEmbedderRunner(runnerClass, annotatedClassName, classLoader);
  9.     }

  10.     private static Class<?> runnerClass(String annotatedClassName, EmbedderClassLoader classLoader) {
  11.         Class<?> annotatedClass = loadClass(annotatedClassName, classLoader);
  12.         RunWith annotation = annotatedClass.getAnnotation(RunWith.class);
  13.         if (annotation != null) {
  14.             return annotation.value();
  15.         }
  16.         throw new MissingAnnotatedEmbedderRunner(annotatedClass);
  17.     }

  18.     private static AnnotatedEmbedderRunner newAnnotatedEmbedderRunner(Class<?> runnerClass, String annotatedClassName,
  19.             EmbedderClassLoader classLoader) {
  20.         try {
  21.             Class<?> annotatedClass = loadClass(annotatedClassName, classLoader);
  22.             return (AnnotatedEmbedderRunner) runnerClass.getConstructor(Class.class).newInstance(annotatedClass);
  23.         } catch (Exception e) {
  24.             throw new AnnotatedEmbedderRunnerInstantiationFailed(runnerClass, annotatedClassName, classLoader, e);
  25.         }
  26.     }

  27.     private static Class<?> loadClass(String className, EmbedderClassLoader classLoader) {
  28.         try {
  29.             return classLoader.loadClass(className);
  30.         } catch (ClassNotFoundException e) {
  31.             throw new ClassLoadingFailed(className, classLoader, e);
  32.         }
  33.     }

  34.     @SuppressWarnings("serial")
  35.     public static class ClassLoadingFailed extends RuntimeException {

  36.         public ClassLoadingFailed(String className, EmbedderClassLoader classLoader, Throwable cause) {
  37.             super("Failed to load class " + className + " with classLoader " + classLoader, cause);
  38.         }

  39.     }

  40.     @SuppressWarnings("serial")
  41.     public static class AnnotatedEmbedderRunnerInstantiationFailed extends RuntimeException {

  42.         public AnnotatedEmbedderRunnerInstantiationFailed(Class<?> runnerClass, String annotatedClassName,
  43.                 EmbedderClassLoader classLoader, Throwable cause) {
  44.             super("Failed to instantiate annotated embedder runner " + runnerClass + " with annotatedClassName "
  45.                     + annotatedClassName + " and classLoader " + classLoader, cause);
  46.         }

  47.     }

  48.     @SuppressWarnings("serial")
  49.     public static class MissingAnnotatedEmbedderRunner extends RuntimeException {

  50.         public MissingAnnotatedEmbedderRunner(Class<?> annotatedClass) {
  51.             super("AnnotatedEmbedderRunner not specified via @RunWith annotation in annotatedClass " + annotatedClass);
  52.         }

  53.     }
  54. }