I should also mention I can't guarantee the assertion statements, as there's
no documentation indicating, for example, whether Project.getArtifactMap
ever returns null.  I'm also supplying what I *think* is the proper key
format for the map, but can't be sure, as that isn't documented either.  I
ended up just looking at the source code and hoping that this key format is
not an internal detail of the class.

Best,
Laird

On Wed, Feb 16, 2011 at 10:11 AM, Laird Nelson <ljnel...@gmail.com> wrote:

> Well, here's how I did it.  It sure ain't pretty, but it works!
>
> Briefly, I grab the set of artifacts from a MavenProject.  Usually because
> I'm doing this from within a plugin whose dependency resolution has been set
> to "test", these artifacts are resolved already, which is convenient, and I
> don't bother to handle the case where they aren't already resolved.  Then I
> invoke MavenProjectBuilder#buildFromRepository() on each of them to get
> project information about each of them.  Now I have a list of
> MavenProjects.  I hand them to a new ProjectSorter, which does the
> topological sort I require, and keeps me blissfully ignorant of how exactly
> Maven does its reactor sorting.
>
> Finally, for each one, I grab its Artifact, and add it in order to the
> returned list.  I threw in an ArtifactFilter in case I want to weed out
> results.
>
> Hopefully this will be useful for other people in similar situations.  Even
> more hopefully someone will come along and ask pointedly why I went to all
> the trouble to rewrite the ArtifactWhosieWhatsit#sort() method, and I will
> reply because I didn't happen upon it.  :-)
>
> Best,
> Laird
>
> public static final List<Artifact> topologicallySort(final MavenProject
> project, MavenProjectBuilder builder, final ArtifactRepository
> localRepository, final ArtifactFilter filter) throws
> ProjectBuildingException, MissingProjectException,
> DuplicateProjectException, CycleDetectedException {
>     if (project == null) {
>       throw new IllegalArgumentException("project == null");
>     }
>     List<Artifact> returnValue = null;
>
>     @SuppressWarnings("unchecked")
>     final Set<Artifact> artifacts = (Set<Artifact>)project.getArtifacts();
>     if (artifacts != null) {
>       returnValue = new ArrayList<Artifact>();
>       if (!artifacts.isEmpty()) {
>         final List<MavenProject> projects = new ArrayList<MavenProject>();
>         projects.add(project);
>
>         if (builder == null) {
>           builder = new DefaultMavenProjectBuilder();
>         }
>
>         for (final Artifact artifact : artifacts) {
>           if (artifact != null) {
>             final MavenProject artifactProject =
> builder.buildFromRepository(artifact,
> project.getRemoteArtifactRepositories(), localRepository);
>             assert artifactProject != null;
>             projects.add(artifactProject);
>           }
>         }
>
>         final ProjectSorter sorter = new ProjectSorter(projects);
>         final List<MavenProject> sortedProjects =
> sorter.getSortedProjects();
>         assert sortedProjects != null;
>         assert sortedProjects.size() == projects.size();
>
>         final Map projectArtifactMap = project.getArtifactMap();
>         assert projectArtifactMap != null;
>
>         for (final MavenProject p : sortedProjects) {
>           if (p != null) {
>             final Artifact artifact = p.getArtifact();
>             if (artifact != null) {
>               final Artifact resolvedArtifact =
> (Artifact)projectArtifactMap.get(artifact.getGroupId() + ":" +
> artifact.getArtifactId());
>               if (resolvedArtifact != null && (filter == null ||
> filter.include(resolvedArtifact))) {
>                 returnValue.add(resolvedArtifact);
>               }
>             }
>           }
>         }
>
>       }
>     }
>
>     return returnValue;
>   }
>

Reply via email to