@Override
  public MavenSession reloadReactor(MavenProject rootProject, MavenSession oldSession)
      throws ReactorReloadException {
    List<MavenProject> reactorProjects = new ArrayList<MavenProject>();

    List<File> pomFiles = newArrayList(rootProject.getFile());
    try {
      MavenProject project = null;
      // try maven3 first
      try {
        if (rootProject.getFile().exists() && rootProject.getFile().canRead()) {
          Method getRequestMethod = oldSession.getClass().getMethod("getRequest");
          Object mavenExecutionRequest = getRequestMethod.invoke(oldSession);
          Method getProjectBuildingRequest =
              mavenExecutionRequest.getClass().getMethod("getProjectBuildingRequest");
          Object pbr = getProjectBuildingRequest.invoke(mavenExecutionRequest);

          Object pb = oldSession.getContainer().lookup("org.apache.maven.project.ProjectBuilder");

          Class requestClass = Class.forName("org.apache.maven.project.ProjectBuildingRequest");

          Method buildMethod =
              pb.getClass().getMethod("build", List.class, boolean.class, requestClass);
          List results = (List) buildMethod.invoke(pb, pomFiles, true, pbr);

          for (Object result : results) {
            Method getProjectMethod = result.getClass().getMethod("getProject");
            getProjectMethod.setAccessible(true);
            project = (MavenProject) getProjectMethod.invoke(result);
            project.setActiveProfiles(rootProject.getActiveProfiles());
            reactorProjects.add(project);
          }
        }

      } catch (Exception e) {
        // MJF-112: Check that the exception is a result of not having Maven 3
        // installed, or a genuine project configuration error
        try {
          oldSession.getClass().getMethod("getProjectBuilderConfiguration");
        } catch (NoSuchMethodException e1) {
          // There is no Maven 2 environment, just report the error
          throw e;
        }

        Stack<File> projectFiles = new Stack<File>();
        projectFiles.push(rootProject.getFile());

        while (!projectFiles.isEmpty()) {
          File file = (File) projectFiles.pop();

          if (!file.exists() || !file.canRead()) {
            continue;
          }

          // Fallback to Maven 2 API
          project = projectBuilder.build(file, oldSession.getProjectBuilderConfiguration());
          project.setActiveProfiles(rootProject.getActiveProfiles());
          List<String> moduleNames = project.getModules();

          for (String moduleName : moduleNames) {
            // if moduleName is a file treat as explicitly defined pom.xml
            File baseFile = new File(file.getParentFile(), moduleName);
            if (baseFile.isFile()) {
              projectFiles.push(baseFile);
            } else {
              projectFiles.push(new File(baseFile, File.separator + "pom.xml"));
            }
          }

          reactorProjects.add(project);
        }
      }

      ReactorManager reactorManager = new ReactorManager(reactorProjects);
      MavenSession newSession =
          new MavenSession(
              oldSession.getContainer(),
              oldSession.getSettings(),
              oldSession.getLocalRepository(),
              oldSession.getEventDispatcher(),
              reactorManager,
              oldSession.getGoals(),
              oldSession.getExecutionRootDirectory(),
              oldSession.getExecutionProperties(),
              oldSession.getUserProperties(),
              oldSession.getStartTime());

      // in case of maven 3
      try {
        Method setProjectsMethod = newSession.getClass().getMethod("setProjects", List.class);
        setProjectsMethod.invoke(newSession, reactorManager.getSortedProjects());
      } catch (Exception ignore) {
        // ignore
      }

      return newSession;
    } catch (Exception e) {
      throw new ReactorReloadException("Error reloading Maven reactor projects", e);
    }
  }