| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.maven.plugins.changes; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.apache.maven.plugin.MojoExecutionException; |
| import org.apache.maven.plugin.logging.Log; |
| import org.apache.maven.plugins.changes.model.Action; |
| import org.apache.maven.plugins.changes.model.Release; |
| |
| /** |
| * A utility class for working with Release objects. |
| * |
| * @author Dennis Lundberg |
| * @version $Id$ |
| * @since 2.4 |
| */ |
| public class ReleaseUtils { |
| private static final String SNAPSHOT_SUFFIX = "-SNAPSHOT"; |
| |
| private Log log; |
| |
| public ReleaseUtils(Log log) { |
| this.log = log; |
| } |
| |
| /** |
| * Get the latest release by matching the supplied releases with the version from the pom. |
| * |
| * @param releases list of releases |
| * @param pomVersion Version of the artifact |
| * @return A <code>Release</code> that matches the next release of the current project |
| * @throws org.apache.maven.plugin.MojoExecutionException If a release can't be found |
| */ |
| public Release getLatestRelease(List<Release> releases, String pomVersion) throws MojoExecutionException { |
| // Remove "-SNAPSHOT" from the end, if it's there |
| if (pomVersion != null && pomVersion.endsWith(SNAPSHOT_SUFFIX)) { |
| pomVersion = pomVersion.substring(0, pomVersion.length() - SNAPSHOT_SUFFIX.length()); |
| } |
| getLog().debug("Found " + releases.size() + " releases."); |
| |
| Release release = getRelease(releases, pomVersion); |
| |
| if (release == null) { |
| throw new MojoExecutionException("Couldn't find the release '" + pomVersion |
| + "' among the supplied releases: " + toString(releases)); |
| } |
| |
| return release; |
| } |
| |
| private Log getLog() { |
| return log; |
| } |
| |
| /** |
| * Get a release with the specified version from the list of releases. |
| * |
| * @param releases A list of releases |
| * @param version The version we want |
| * @return A Release, or null if no release with the specified version can be found |
| */ |
| protected Release getRelease(List<Release> releases, String version) { |
| for (Release release : releases) { |
| if (getLog().isDebugEnabled()) { |
| getLog().debug("The release: " + release.getVersion() + " has " |
| + release.getActions().size() + " actions."); |
| } |
| |
| if (release.getVersion() != null && release.getVersion().equals(version)) { |
| if (getLog().isDebugEnabled()) { |
| getLog().debug("Found the correct release: " + release.getVersion()); |
| logRelease(release); |
| } |
| return release; |
| } |
| } |
| return null; |
| } |
| |
| protected void logRelease(Release release) { |
| Action action; |
| for (Action action1 : release.getActions()) { |
| action = action1; |
| getLog().debug("o " + action.getType()); |
| getLog().debug("issue : " + action.getIssue()); |
| getLog().debug("action : " + action.getAction()); |
| getLog().debug("dueTo : " + action.getDueTo()); |
| } |
| } |
| |
| /** |
| * Merge releases from one issue tracker with releases from another issue tracker. If a release is found in both |
| * issue trackers, i.e. they have the same version, their issues are merged into one release. |
| * |
| * @param firstReleases Releases from the first issue tracker |
| * @param secondReleases Releases from the second issue tracker |
| * @return A list containing the merged releases |
| */ |
| public List<Release> mergeReleases(final List<Release> firstReleases, final List<Release> secondReleases) { |
| if (firstReleases == null && secondReleases == null) { |
| return Collections.emptyList(); |
| } |
| if (firstReleases == null) { |
| return secondReleases; |
| } |
| if (secondReleases == null) { |
| return firstReleases; |
| } |
| |
| List<Release> mergedReleases = new ArrayList<>(); |
| |
| // Loop through the releases from the first issue tracker, merging in |
| // actions from releases with the same version from the second issue |
| // tracker |
| for (Release firstRelease : firstReleases) { |
| Release secondRelease = getRelease(secondReleases, firstRelease.getVersion()); |
| if (secondRelease != null) { |
| if (secondRelease.getActions() != null) { |
| firstRelease.getActions().addAll(secondRelease.getActions()); |
| } |
| } |
| mergedReleases.add(firstRelease); |
| } |
| |
| // Handle releases that are only in the second issue tracker |
| for (Release secondRelease : secondReleases) { |
| Release mergedRelease = getRelease(mergedReleases, secondRelease.getVersion()); |
| if (mergedRelease == null) { |
| mergedReleases.add(secondRelease); |
| } |
| } |
| return mergedReleases; |
| } |
| |
| /** |
| * Merge releases from parent component with releases from child component. If a release is found in both |
| * components, i.e. they have the same version, their issues are merged into one (parent) release with component |
| * marker for component issues. |
| * |
| * @param releases Releases from the parent component |
| * @param componentName child component name (retrieved from project name) |
| * @param componentReleases Releases from the child component |
| * @return A list containing the merged releases |
| */ |
| public List<Release> mergeReleases( |
| final List<Release> releases, final String componentName, final List<Release> componentReleases) { |
| if (releases == null && componentReleases == null) { |
| return Collections.emptyList(); |
| } |
| if (componentReleases == null) { |
| return releases; |
| } |
| |
| final List<Release> mergedReleases = new ArrayList<>(); |
| |
| if (releases != null) { |
| for (Object release1 : releases) { |
| final Release release = (Release) release1; |
| final Release componentRelease = getRelease(componentReleases, release.getVersion()); |
| if (componentRelease != null) { |
| release.addComponent(componentName, componentRelease); |
| } |
| mergedReleases.add(release); |
| } |
| } |
| |
| for (Object componentRelease1 : componentReleases) { |
| final Release release = (Release) componentRelease1; |
| final Release mergedRelease = getRelease(mergedReleases, release.getVersion()); |
| if (mergedRelease == null) { |
| final Release componentRelease = new Release(); |
| componentRelease.setVersion(release.getVersion()); |
| componentRelease.setDateRelease(release.getDateRelease()); |
| componentRelease.addComponent(componentName, release); |
| mergedReleases.add(componentRelease); |
| } |
| } |
| |
| return mergedReleases; |
| } |
| |
| private static String toString(Release release) { |
| return release.getClass().getSimpleName() + "[version='" + release.getVersion() + "'" + ", date='" |
| + release.getDateRelease() + "'" + ", description='" + release.getDescription() + "'" + ", actionsSize=" |
| + release.getActions().size() + "]"; |
| } |
| |
| public static String toString(List<Release> releases) { |
| List<String> releaseStrings = new ArrayList<>(releases.size()); |
| for (Release release : releases) { |
| releaseStrings.add(toString(release)); |
| } |
| return releaseStrings.toString(); |
| } |
| } |