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 }