protected Solution buildAndSolve(
     SolverFactory solverFactory,
     EnvironmentMode environmentMode,
     Solution planningProblem,
     long maximumMinutesSpend) {
   solverFactory
       .getSolverConfig()
       .getTerminationConfig()
       .setMaximumMinutesSpend(maximumMinutesSpend);
   SolverConfig solverConfig = solverFactory.getSolverConfig();
   solverConfig.setEnvironmentMode(environmentMode);
   ScoreDirectorFactoryConfig assertionScoreDirectorFactory =
       createOverwritingAssertionScoreDirectorFactory();
   if (assertionScoreDirectorFactory != null && environmentMode.isAsserted()) {
     solverConfig
         .getScoreDirectorFactoryConfig()
         .setAssertionScoreDirectorFactory(assertionScoreDirectorFactory);
   }
   Solver solver = solverFactory.buildSolver();
   solver.setPlanningProblem(planningProblem);
   solver.solve();
   Solution bestSolution = solver.getBestSolution();
   if (bestSolution == null) {
     // Solver didn't make it past initialization // TODO remove me once getBestSolution() never
     // returns null
     bestSolution = planningProblem;
   }
   return bestSolution;
 }