001    package org.apache.maven.artifact.resolver;
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.HashSet;
023    import java.util.Set;
024    
025    import org.apache.maven.artifact.Artifact;
026    import org.apache.maven.artifact.versioning.VersionRange;
027    import org.codehaus.plexus.logging.Logger;
028    
029    /**
030     * Send resolution events to the debug log.
031     *
032     * @author <a href="mailto:brett@apache.org">Brett Porter</a>
033     */
034    public class DebugResolutionListener
035        implements ResolutionListener, ResolutionListenerForDepMgmt
036    {
037        private Logger logger;
038    
039        private String indent = "";
040    
041        private static Set<Artifact> ignoredArtifacts = new HashSet<Artifact>();
042    
043        public DebugResolutionListener( Logger logger )
044        {
045            this.logger = logger;
046        }
047    
048        public void testArtifact( Artifact node )
049        {
050        }
051    
052        public void startProcessChildren( Artifact artifact )
053        {
054            indent += "  ";
055        }
056    
057        public void endProcessChildren( Artifact artifact )
058        {
059            indent = indent.substring( 2 );
060        }
061    
062        public void includeArtifact( Artifact artifact )
063        {
064            logger.debug( indent + artifact + " (selected for " + artifact.getScope() + ")" );
065        }
066    
067        public void omitForNearer( Artifact omitted, Artifact kept )
068        {
069            String omittedVersion = omitted.getVersion();
070            String keptVersion = kept.getVersion();
071    
072            if ( omittedVersion != null ? !omittedVersion.equals( keptVersion ) : keptVersion != null )
073            {
074                logger.debug( indent + omitted + " (removed - nearer found: " + kept.getVersion() + ")" );
075            }
076        }
077    
078        public void omitForCycle( Artifact omitted )
079        {
080            logger.debug( indent + omitted + " (removed - causes a cycle in the graph)" );
081        }
082    
083        public void updateScopeCurrentPom( Artifact artifact, String ignoredScope )
084        {
085            logger.debug( indent + artifact + " (not setting artifactScope to: " + ignoredScope + "; local artifactScope "
086                + artifact.getScope() + " wins)" );
087    
088            // TODO: better way than static? this might hide messages in a reactor
089            if ( !ignoredArtifacts.contains( artifact ) )
090            {
091                logger.warn( "\n\tArtifact " + artifact + " retains local artifactScope '" + artifact.getScope()
092                    + "' overriding broader artifactScope '" + ignoredScope + "'\n"
093                    + "\tgiven by a dependency. If this is not intended, modify or remove the local artifactScope.\n" );
094                ignoredArtifacts.add( artifact );
095            }
096        }
097    
098        public void updateScope( Artifact artifact, String scope )
099        {
100            logger.debug( indent + artifact + " (setting artifactScope to: " + scope + ")" );
101        }
102    
103        public void selectVersionFromRange( Artifact artifact )
104        {
105            logger.debug( indent + artifact + " (setting version to: " + artifact.getVersion() + " from range: "
106                + artifact.getVersionRange() + ")" );
107        }
108    
109        public void restrictRange( Artifact artifact, Artifact replacement, VersionRange newRange )
110        {
111            logger.debug( indent + artifact + " (range restricted from: " + artifact.getVersionRange() + " and: "
112                + replacement.getVersionRange() + " to: " + newRange + " )" );
113        }
114    
115        /**
116         * The logic used here used to be a copy of the logic used in the DefaultArtifactCollector, and this method was
117         * called right before the actual version/artifactScope changes were done. However, a different set of conditionals (and
118         * more information) is needed to be able to determine when and if the version and/or artifactScope changes. See the two
119         * added methods, manageArtifactVersion and manageArtifactScope.
120         */
121        public void manageArtifact( Artifact artifact, Artifact replacement )
122        {
123            String msg = indent + artifact;
124            msg += " (";
125            if ( replacement.getVersion() != null )
126            {
127                msg += "applying version: " + replacement.getVersion() + ";";
128            }
129            if ( replacement.getScope() != null )
130            {
131                msg += "applying artifactScope: " + replacement.getScope();
132            }
133            msg += ")";
134            logger.debug( msg );
135        }
136    
137        public void manageArtifactVersion( Artifact artifact, Artifact replacement )
138        {
139            // only show msg if a change is actually taking place
140            if ( !replacement.getVersion().equals( artifact.getVersion() ) )
141            {
142                String msg = indent + artifact + " (applying version: " + replacement.getVersion() + ")";
143                logger.debug( msg );
144            }
145        }
146    
147        public void manageArtifactScope( Artifact artifact, Artifact replacement )
148        {
149            // only show msg if a change is actually taking place
150            if ( !replacement.getScope().equals( artifact.getScope() ) )
151            {
152                String msg = indent + artifact + " (applying artifactScope: " + replacement.getScope() + ")";
153                logger.debug( msg );
154            }
155        }
156    
157        public void manageArtifactSystemPath( Artifact artifact, Artifact replacement )
158        {
159            // only show msg if a change is actually taking place
160            if ( !replacement.getScope().equals( artifact.getScope() ) )
161            {
162                String msg = indent + artifact + " (applying system path: " + replacement.getFile() + ")";
163                logger.debug( msg );
164            }
165        }
166    
167    }