/**
   * Helper to check if a Eclipse plugin unconfiguration is needed. This usually happens if the
   * maven plugin has been unconfigured.
   *
   * @param curMavenProjectFacade the current {@code IMavenProjectFacade}.
   * @param oldMavenProjectFacade the previous {@code IMavenProjectFacade}.
   * @return {@code true} if the Eclipse plugin configuration needs to be deleted.
   * @throws CoreException
   */
  private boolean checkUnconfigurationRequired(
      IProgressMonitor monitor,
      final IMavenProjectFacade curMavenProjectFacade,
      final IMavenProjectFacade oldMavenProjectFacade)
      throws CoreException {
    Preconditions.checkNotNull(curMavenProjectFacade);

    if (oldMavenProjectFacade == null) {
      return false;
    }
    final MavenPluginWrapper newMavenPlugin = this.getMavenPlugin(monitor, curMavenProjectFacade);
    final MavenPluginWrapper oldMavenPlugin = this.getMavenPlugin(monitor, oldMavenProjectFacade);
    if (!newMavenPlugin.isPluginConfigured() && oldMavenPlugin.isPluginConfigured()) {
      return true;
    }
    return false;
  }
 private MavenPluginWrapper getMavenPlugin(
     IProgressMonitor monitor, final IMavenProjectFacade projectFacade) throws CoreException {
   return MavenPluginWrapper.newInstance(
       monitor,
       getMavenPluginGroupId(),
       getMavenPluginArtifactId(),
       getMavenPluginGoal(),
       projectFacade);
 }
  @Override
  public void mavenProjectChanged(
      final MavenProjectChangedEvent mavenProjectChangedEvent, final IProgressMonitor monitor)
      throws CoreException {
    final IMavenProjectFacade mavenProjectFacade = mavenProjectChangedEvent.getMavenProject();

    if (mavenProjectFacade != null) {
      final MavenProject mavenProject = mavenProjectFacade.getMavenProject();
      if (mavenProject == null) {
        return;
      }
      final MavenPluginWrapper pluginWrapper = this.getMavenPlugin(monitor, mavenProjectFacade);
      final IProject project = mavenProjectFacade.getProject();
      if (this.checkUnconfigurationRequired(
          monitor, mavenProjectFacade, mavenProjectChangedEvent.getOldMavenProject())) {
        this.unconfigureEclipsePlugin(project, monitor);
        return;
      }
      if (pluginWrapper.isPluginConfigured()) {
        // only call handler if maven plugin is configured or found.
        // we need a session.
        MavenExecutionRequest request = maven.createExecutionRequest(monitor);
        MavenSession session = maven.createSession(request, mavenProject);
        this.handleProjectConfigurationChange(
            session, mavenProjectFacade, project, monitor, pluginWrapper);
      } else {
        // TODO: redirect to eclipse logger.
        // this.console.logMessage(String.format(
        // "Will not configure the Eclipse Plugin for Maven Plugin [%s:%s],"
        // +
        // "(Could not find maven plugin instance or configuration in pom)",
        // this.getMavenPluginGroupId(),
        // this.getMavenPluginArtifactId()));
      }
    }
    super.mavenProjectChanged(mavenProjectChangedEvent, monitor);
  }
  @Override
  public void configure(final ProjectConfigurationRequest request, final IProgressMonitor monitor)
      throws CoreException {

    final MavenProject mavenProject = request.getMavenProject();
    if (mavenProject == null) {
      return;
    }

    final MavenPluginWrapper pluginWrapper =
        this.getMavenPlugin(monitor, request.getMavenProjectFacade());
    final IProject project = request.getProject();

    if (!pluginWrapper.isPluginConfigured()) {
      return;
    }

    this.handleProjectConfigurationChange(
        request.getMavenSession(),
        request.getMavenProjectFacade(),
        project,
        monitor,
        pluginWrapper);
  }