// Path: src/main/java/de/bechte/junit/runners/context/statements/MethodStatementExecutor.java
// public class MethodStatementExecutor extends StatementExecutor {
//     @Override
//     protected void beforeExecution(final EachTestNotifier notifier) {
//         notifier.fireTestStarted();
//     }
// 
//     @Override
//     protected void afterExecution(final EachTestNotifier notifier) {
//         notifier.fireTestFinished();
//     }
// }
// 
// Path: src/main/java/de/bechte/junit/runners/context/statements/StatementExecutor.java
// public class StatementExecutor {
//     public void execute(final Statement statement, final RunNotifier notifier, final Description description) {
//         final EachTestNotifier eachNotifier = new EachTestNotifier(notifier, description);
//         try {
//             beforeExecution(eachNotifier);
//             statement.evaluate();
//         } catch (final InitializationError e) {
//             whenInitializationErrorIsRaised(eachNotifier, e);
//         } catch (final AssumptionViolatedException e) {
//             whenAssumptionViolatedExceptionIsRaised(eachNotifier, e);
//         } catch (final Throwable e) {
//             whenThrowableIsRaised(eachNotifier, e);
//         } finally {
//             afterExecution(eachNotifier);
//         }
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior prior to the execution of the statement.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      */
//     protected void beforeExecution(final EachTestNotifier notifier) {
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior when a {@link InitializationError} is raised.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      * @param e the error
//      */
//     protected void whenInitializationErrorIsRaised(final EachTestNotifier notifier, final InitializationError e) {
//         notifier.addFailure(new MultipleFailureException(e.getCauses()));
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior when a {@link AssumptionViolatedException} is raised.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      * @param e the error
//      */
//     protected void whenAssumptionViolatedExceptionIsRaised(final EachTestNotifier notifier, final AssumptionViolatedException e) {
//         notifier.addFailedAssumption(e);
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior when a {@link Throwable} is raised.
//      *
//      * @param notifier the notifier
//      * @param e the error
//      */
//     protected void whenThrowableIsRaised(final EachTestNotifier notifier, final Throwable e) {
//         notifier.addFailure(e);
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior after the execution of the statement.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      */
//     protected void afterExecution(final EachTestNotifier notifier) {
//     }
// }
// 
// Path: src/main/java/de/bechte/junit/runners/context/statements/StatementExecutorFactory.java
// public abstract class StatementExecutorFactory {
//     protected static final String PROPERTY_KEY = StatementExecutorFactory.class.getCanonicalName();
//     private static StatementExecutorFactory factory = null;
// 
//     public static StatementExecutorFactory getDefault() {
//         if (factory == null)
//             lazyLoadFactory();
//         return factory;
//     }
// 
//     private static void lazyLoadFactory() {
//         final String factoryName = System.getProperty(PROPERTY_KEY);
//         try {
//             factory = (factoryName == null)
//                     ? new DefaultStatementExecutorFactory()
//                     : (StatementExecutorFactory) Class.forName(factoryName).newInstance();
//         } catch (final Throwable t) {
//             throw new IllegalStateException("JUnit system not configured correctly. " +
//                     "Cannot find StatementExecutorFactory! Invalid factory name given: " + factoryName, t);
//         }
//     }
// 
//     protected StatementExecutorFactory() {
//         super();
//     }
// 
//     public abstract StatementExecutor getExecutorForClasses();
//     public abstract StatementExecutor getExecutorForMethods();
// }


import de.bechte.junit.runners.context.statements.MethodStatementExecutor;
import de.bechte.junit.runners.context.statements.StatementExecutor;
import de.bechte.junit.runners.context.statements.StatementExecutorFactory;
package de.bechte.junit.runners.context.statements;


/**
 * The {@link StatementExecutorFactory} resolves the {@link StatementExecutor}s for classes and methods. These two
 * types might differ, as they require different reporting.
 *
 * The default implementation returns:
 * the {@link StatementExecutor} for classes,
 * the {@link MethodStatementExecutor} for methods.
 */
public class DefaultStatementExecutorFactory extends StatementExecutorFactory {
    private final StatementExecutor statementExecutor;
    private final MethodStatementExecutor methodStatementExecutor;

    public DefaultStatementExecutorFactory() {
        super();
// Path: src/main/java/de/bechte/junit/runners/context/statements/MethodStatementExecutor.java
// public class MethodStatementExecutor extends StatementExecutor {
//     @Override
//     protected void beforeExecution(final EachTestNotifier notifier) {
//         notifier.fireTestStarted();
//     }
// 
//     @Override
//     protected void afterExecution(final EachTestNotifier notifier) {
//         notifier.fireTestFinished();
//     }
// }
// 
// Path: src/main/java/de/bechte/junit/runners/context/statements/StatementExecutor.java
// public class StatementExecutor {
//     public void execute(final Statement statement, final RunNotifier notifier, final Description description) {
//         final EachTestNotifier eachNotifier = new EachTestNotifier(notifier, description);
//         try {
//             beforeExecution(eachNotifier);
//             statement.evaluate();
//         } catch (final InitializationError e) {
//             whenInitializationErrorIsRaised(eachNotifier, e);
//         } catch (final AssumptionViolatedException e) {
//             whenAssumptionViolatedExceptionIsRaised(eachNotifier, e);
//         } catch (final Throwable e) {
//             whenThrowableIsRaised(eachNotifier, e);
//         } finally {
//             afterExecution(eachNotifier);
//         }
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior prior to the execution of the statement.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      */
//     protected void beforeExecution(final EachTestNotifier notifier) {
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior when a {@link InitializationError} is raised.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      * @param e the error
//      */
//     protected void whenInitializationErrorIsRaised(final EachTestNotifier notifier, final InitializationError e) {
//         notifier.addFailure(new MultipleFailureException(e.getCauses()));
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior when a {@link AssumptionViolatedException} is raised.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      * @param e the error
//      */
//     protected void whenAssumptionViolatedExceptionIsRaised(final EachTestNotifier notifier, final AssumptionViolatedException e) {
//         notifier.addFailedAssumption(e);
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior when a {@link Throwable} is raised.
//      *
//      * @param notifier the notifier
//      * @param e the error
//      */
//     protected void whenThrowableIsRaised(final EachTestNotifier notifier, final Throwable e) {
//         notifier.addFailure(e);
//     }
// 
//     /**
//      * Clients may override this method to add additional behavior after the execution of the statement.
//      * The call of this method is guaranteed.
//      *
//      * @param notifier the notifier
//      */
//     protected void afterExecution(final EachTestNotifier notifier) {
//     }
// }
// 
// Path: src/main/java/de/bechte/junit/runners/context/statements/StatementExecutorFactory.java
// public abstract class StatementExecutorFactory {
//     protected static final String PROPERTY_KEY = StatementExecutorFactory.class.getCanonicalName();
//     private static StatementExecutorFactory factory = null;
// 
//     public static StatementExecutorFactory getDefault() {
//         if (factory == null)
//             lazyLoadFactory();
//         return factory;
//     }
// 
//     private static void lazyLoadFactory() {
//         final String factoryName = System.getProperty(PROPERTY_KEY);
//         try {
//             factory = (factoryName == null)
//                     ? new DefaultStatementExecutorFactory()
//                     : (StatementExecutorFactory) Class.forName(factoryName).newInstance();
//         } catch (final Throwable t) {
//             throw new IllegalStateException("JUnit system not configured correctly. " +
//                     "Cannot find StatementExecutorFactory! Invalid factory name given: " + factoryName, t);
//         }
//     }
// 
//     protected StatementExecutorFactory() {
//         super();
//     }
// 
//     public abstract StatementExecutor getExecutorForClasses();
//     public abstract StatementExecutor getExecutorForMethods();
// }


// Path: src/main/java/de/bechte/junit/runners/context/statements/DefaultStatementExecutorFactory.java
import de.bechte.junit.runners.context.statements.MethodStatementExecutor;
import de.bechte.junit.runners.context.statements.StatementExecutor;
import de.bechte.junit.runners.context.statements.StatementExecutorFactory;

package de.bechte.junit.runners.context.statements;


/**
 * The {@link StatementExecutorFactory} resolves the {@link StatementExecutor}s for classes and methods. These two
 * types might differ, as they require different reporting.
 *
 * The default implementation returns:
 * the {@link StatementExecutor} for classes,
 * the {@link MethodStatementExecutor} for methods.
 */
public class DefaultStatementExecutorFactory extends StatementExecutorFactory {
    private final StatementExecutor statementExecutor;
    private final MethodStatementExecutor methodStatementExecutor;

    public DefaultStatementExecutorFactory() {
        super();
        statementExecutor = new StatementExecutor();