/**
   * Processes the specified file. This is an extension point to allow updating a file external to
   * the reactor.
   *
   * @param outFile The file to process.
   * @throws MojoExecutionException If things go wrong.
   * @throws MojoFailureException If things go wrong.
   * @since 1.0-alpha-1
   */
  protected void process(File outFile) throws MojoExecutionException, MojoFailureException {
    try {
      StringBuilder input = PomHelper.readXmlFile(outFile);
      ModifiedPomXMLEventReader newPom = newModifiedPomXER(input);

      update(newPom);

      if (newPom.isModified()) {
        if (Boolean.FALSE.equals(generateBackupPoms)) {
          getLog().debug("Skipping generation of backup file");
        } else {
          File backupFile =
              new File(outFile.getParentFile(), outFile.getName() + ".versionsBackup");
          if (!backupFile.exists()) {
            getLog().debug("Backing up " + outFile + " to " + backupFile);
            FileUtils.copyFile(outFile, backupFile);
          } else {
            getLog().debug("Leaving existing backup " + backupFile + " unmodified");
          }
        }
        writeFile(outFile, input);
      }
    } catch (IOException e) {
      getLog().error(e);
    } catch (XMLStreamException e) {
      getLog().error(e);
    } catch (ArtifactMetadataRetrievalException e) {
      throw new MojoExecutionException(e.getMessage(), e);
    }
  }
  private void useLatestSnapshots(ModifiedPomXMLEventReader pom, Collection dependencies)
      throws XMLStreamException, MojoExecutionException, ArtifactMetadataRetrievalException {
    int segment =
        determineUnchangedSegment(allowMajorUpdates, allowMinorUpdates, allowIncrementalUpdates);

    Iterator i = dependencies.iterator();

    while (i.hasNext()) {
      Dependency dep = (Dependency) i.next();

      if (isExcludeReactor() && isProducedByReactor(dep)) {
        getLog().info("Ignoring reactor dependency: " + toString(dep));
        continue;
      }

      String version = dep.getVersion();
      Matcher versionMatcher = matchSnapshotRegex.matcher(version);
      if (!versionMatcher.matches()) {
        getLog().debug("Looking for latest snapshot of " + toString(dep));
        Artifact artifact = this.toArtifact(dep);
        if (!isIncluded(artifact)) {
          continue;
        }

        ArtifactVersions versions = getHelper().lookupArtifactVersions(artifact, false);
        final VersionComparator versionComparator = versions.getVersionComparator();
        final DefaultArtifactVersion lowerBound = new DefaultArtifactVersion(version);
        if (segment + 1 > versionComparator.getSegmentCount(lowerBound)) {
          getLog().info("Ignoring " + toString(dep) + " as the version number is too short");
          continue;
        }
        ArtifactVersion upperBound =
            segment >= 0 ? versionComparator.incrementSegment(lowerBound, segment) : null;
        getLog().info("Upper bound: " + (upperBound == null ? "none" : upperBound.toString()));
        ArtifactVersion[] newer = versions.getVersions(lowerBound, upperBound, true, false, false);
        getLog().debug("Candidate versions " + Arrays.asList(newer));
        String latestVersion = null;
        for (int j = 0; j < newer.length; j++) {
          String newVersion = newer[j].toString();
          if (matchSnapshotRegex.matcher(newVersion).matches()) {
            latestVersion = newVersion;
          }
        }
        if (latestVersion != null) {
          if (PomHelper.setDependencyVersion(
              pom, dep.getGroupId(), dep.getArtifactId(), version, latestVersion)) {
            getLog().info("Updated " + toString(dep) + " to version " + latestVersion);
          }
        }
      }
    }
  }
  protected void updatePropertyToNewestVersion(
      ModifiedPomXMLEventReader pom,
      Property property,
      PropertyVersions version,
      String currentVersion)
      throws MojoExecutionException, XMLStreamException {
    ArtifactVersion winner =
        version.getNewestVersion(
            currentVersion, property, this.allowSnapshots, this.reactorProjects, this.getHelper());

    if (winner == null || currentVersion.equals(winner.toString())) {
      getLog()
          .info("Property ${" + property.getName() + "}: Leaving unchanged as " + currentVersion);
    } else if (PomHelper.setPropertyVersion(
        pom, version.getProfileId(), property.getName(), winner.toString())) {
      getLog()
          .info("Updated ${" + property.getName() + "} from " + currentVersion + " to " + winner);
    }
  }