001    package org.apache.maven.lifecycle.internal;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *  http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.util.ArrayList;
023    import java.util.Collections;
024    import java.util.HashMap;
025    import java.util.HashSet;
026    import java.util.Iterator;
027    import java.util.List;
028    import java.util.Map;
029    import java.util.Set;
030    
031    import org.apache.maven.artifact.ArtifactUtils;
032    import org.apache.maven.execution.MavenSession;
033    import org.apache.maven.project.MavenProject;
034    
035    /**
036     * A list of project segments, ordered so that all ProjectSegments from first TaskSegment come before any
037     * subsequent TaskSegments.
038     * 
039     * @since 3.0
040     * @author Kristian Rosenvold
041     *         <p/>
042     *         NOTE: This class is not part of any public api and can be changed or deleted without prior notice.
043     */
044    public class ProjectBuildList
045        implements Iterable<ProjectSegment>
046    {
047        private final List<ProjectSegment> items;
048    
049        public ProjectBuildList( List<ProjectSegment> items )
050        {
051            this.items = Collections.unmodifiableList( items );
052        }
053    
054        // TODO: Optimize; or maybe just rewrite the whole way aggregating mojos are being run.
055        /**
056         * Returns aProjectBuildList that contains only items for the specified taskSegment
057         * @param taskSegment the requested tasksegment
058         * @return a project build list for the supplied task segment
059         */
060        public ProjectBuildList getByTaskSegment( TaskSegment taskSegment )
061        {
062            List<ProjectSegment> currentSegment = new ArrayList<ProjectSegment>();
063            for ( ProjectSegment projectBuild : items )
064            {
065                if ( taskSegment == projectBuild.getTaskSegment() )
066                { // NOTE: There's no notion of taskSegment equality.
067                    currentSegment.add( projectBuild );
068                }
069            }
070            return new ProjectBuildList( currentSegment );
071        }
072    
073        public Map<MavenProject, ProjectSegment> selectSegment( TaskSegment taskSegment )
074        {
075            Map<MavenProject, ProjectSegment> result = new HashMap<MavenProject, ProjectSegment>();
076            for ( ProjectSegment projectBuild : items )
077            {
078                if ( taskSegment == projectBuild.getTaskSegment() )
079                { // NOTE: There's no notion of taskSegment equality.
080                    result.put( projectBuild.getProject(), projectBuild );
081                }
082            }
083            return result;
084        }
085    
086        /**
087         * Finds the first ProjectSegment matching the supplied project
088         * @param mavenProject the requested project
089         * @return The projectSegment or null.
090         */
091        public ProjectSegment findByMavenProject( MavenProject mavenProject )
092        {
093            for ( ProjectSegment projectBuild : items )
094            {
095                if ( mavenProject.equals( projectBuild.getProject() ) )
096                {
097                    return projectBuild;
098                }
099            }
100            return null;
101        }
102    
103        public Iterator<ProjectSegment> iterator()
104        {
105            return items.iterator();
106        }
107    
108        public void closeAll()
109        {
110            for ( ProjectSegment item : items )
111            {
112                MavenSession sessionForThisModule = item.getSession();
113                sessionForThisModule.setCurrentProject( null );
114            }
115        }
116    
117        public int size()
118        {
119            return items.size();
120        }
121    
122        ProjectSegment get( int index )
123        {
124            return items.get( index );
125        }
126    
127        public Set<String> getReactorProjectKeys()
128        {
129            Set<String> projectKeys = new HashSet<String>( items.size() * 2 );
130            for ( ProjectSegment projectBuild : items )
131            {
132                MavenProject project = projectBuild.getProject();
133                String key = ArtifactUtils.key( project.getGroupId(), project.getArtifactId(), project.getVersion() );
134                projectKeys.add( key );
135            }
136            return projectKeys;
137        }
138    
139    
140        public boolean isEmpty()
141        {
142            return items.isEmpty();
143        }
144    }