001    package org.apache.maven.execution;
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    
023    import org.apache.maven.artifact.ArtifactUtils;
024    import org.apache.maven.plugin.descriptor.PluginDescriptor;
025    import org.apache.maven.project.DuplicateProjectException;
026    import org.apache.maven.project.MavenProject;
027    import org.apache.maven.project.ProjectSorter;
028    import org.codehaus.plexus.util.dag.CycleDetectedException;
029    
030    import java.util.ArrayList;
031    import java.util.HashMap;
032    import java.util.Iterator;
033    import java.util.List;
034    import java.util.Map;
035    
036    @Deprecated
037    public class ReactorManager
038    {
039        public static final String FAIL_FAST = "fail-fast";
040    
041        public static final String FAIL_AT_END = "fail-at-end";
042    
043        public static final String FAIL_NEVER = "fail-never";
044    
045        public static final String MAKE_MODE = "make";
046    
047        public static final String MAKE_DEPENDENTS_MODE = "make-dependents";
048    
049        // make projects that depend on me, and projects that I depend on
050        public static final String MAKE_BOTH_MODE = "make-both";
051    
052        private List blackList = new ArrayList();
053    
054        private Map buildFailuresByProject = new HashMap();
055    
056        private Map pluginContextsByProjectAndPluginKey = new HashMap();
057    
058        private String failureBehavior = FAIL_FAST;
059    
060        private final ProjectSorter sorter;
061    
062        private Map buildSuccessesByProject = new HashMap();
063    
064        public ReactorManager( List projects )
065            throws CycleDetectedException, DuplicateProjectException
066        {
067            this.sorter = new ProjectSorter( projects );
068        }
069    
070        public Map getPluginContext( PluginDescriptor plugin, MavenProject project )
071        {
072            Map pluginContextsByKey = (Map) pluginContextsByProjectAndPluginKey.get( project.getId() );
073    
074            if ( pluginContextsByKey == null )
075            {
076                pluginContextsByKey = new HashMap();
077                pluginContextsByProjectAndPluginKey.put( project.getId(), pluginContextsByKey );
078            }
079    
080            Map pluginContext = (Map) pluginContextsByKey.get( plugin.getPluginLookupKey() );
081    
082            if ( pluginContext == null )
083            {
084                pluginContext = new HashMap();
085                pluginContextsByKey.put( plugin.getPluginLookupKey(), pluginContext );
086            }
087    
088            return pluginContext;
089        }
090    
091        public void setFailureBehavior( String failureBehavior )
092        {
093            if ( failureBehavior == null )
094            {
095                this.failureBehavior = FAIL_FAST; // default
096                return;
097            }
098            if ( FAIL_FAST.equals( failureBehavior ) || FAIL_AT_END.equals( failureBehavior )
099                || FAIL_NEVER.equals( failureBehavior ) )
100            {
101                this.failureBehavior = failureBehavior;
102            }
103            else
104            {
105                throw new IllegalArgumentException( "Invalid failure behavior (must be one of: \'" + FAIL_FAST + "\', \'"
106                    + FAIL_AT_END + "\', \'" + FAIL_NEVER + "\')." );
107            }
108        }
109    
110        public String getFailureBehavior()
111        {
112            return failureBehavior;
113        }
114    
115        public void blackList( MavenProject project )
116        {
117            blackList( getProjectKey( project ) );
118        }
119    
120        private void blackList( String id )
121        {
122            if ( !blackList.contains( id ) )
123            {
124                blackList.add( id );
125    
126                List dependents = sorter.getDependents( id );
127    
128                if ( dependents != null && !dependents.isEmpty() )
129                {
130                    for ( Object dependent : dependents )
131                    {
132                        String dependentId = (String) dependent;
133    
134                        if ( !buildSuccessesByProject.containsKey( dependentId ) && !buildFailuresByProject.containsKey(
135                            dependentId ) )
136                        {
137                            blackList( dependentId );
138                        }
139                    }
140                }
141            }
142        }
143    
144        public boolean isBlackListed( MavenProject project )
145        {
146            return blackList.contains( getProjectKey( project ) );
147        }
148    
149        private static String getProjectKey( MavenProject project )
150        {
151            return ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
152        }
153    
154        public void registerBuildFailure( MavenProject project, Exception error, String task, long time )
155        {
156            buildFailuresByProject.put( getProjectKey( project ), new BuildFailure( project, time, error ) );
157        }
158    
159        public boolean hasBuildFailures()
160        {
161            return !buildFailuresByProject.isEmpty();
162        }
163    
164        public boolean hasBuildFailure( MavenProject project )
165        {
166            return buildFailuresByProject.containsKey( getProjectKey( project ) );
167        }
168    
169        public boolean hasMultipleProjects()
170        {
171            return sorter.hasMultipleProjects();
172        }
173    
174        public List<MavenProject> getSortedProjects()
175        {
176            return sorter.getSortedProjects();
177        }
178    
179        public MavenProject getTopLevelProject()
180        {
181            return sorter.getTopLevelProject();
182        }
183    
184        public boolean hasBuildSuccess( MavenProject project )
185        {
186            return buildSuccessesByProject.containsKey( getProjectKey( project ) );
187        }
188    
189        public void registerBuildSuccess( MavenProject project, long time )
190        {
191            buildSuccessesByProject.put( getProjectKey( project ), new BuildSuccess( project, time ) );
192        }
193    
194        public BuildFailure getBuildFailure( MavenProject project )
195        {
196            return (BuildFailure) buildFailuresByProject.get( getProjectKey( project ) );
197        }
198    
199        public BuildSuccess getBuildSuccess( MavenProject project )
200        {
201            return (BuildSuccess) buildSuccessesByProject.get( getProjectKey( project ) );
202        }
203    
204        public boolean executedMultipleProjects()
205        {
206            return buildFailuresByProject.size() + buildSuccessesByProject.size() > 1;
207        }
208    }