Coverage Report - org.apache.maven.plugin.dependency.AbstractDependencyFilterMojo
 
Classes in this File Line Coverage Branch Coverage Complexity
AbstractDependencyFilterMojo
90%
44/49
75%
3/4
1.857
 
 1  
 package org.apache.maven.plugin.dependency;
 2  
 
 3  
 /*
 4  
  * Licensed to the Apache Software Foundation (ASF) under one
 5  
  * or more contributor license agreements.  See the NOTICE file
 6  
  * distributed with this work for additional information
 7  
  * regarding copyright ownership.  The ASF licenses this file
 8  
  * to you under the Apache License, Version 2.0 (the
 9  
  * "License"); you may not use this file except in compliance
 10  
  * with the License.  You may obtain a copy of the License at
 11  
  *
 12  
  * http://www.apache.org/licenses/LICENSE-2.0
 13  
  *
 14  
  * Unless required by applicable law or agreed to in writing,
 15  
  * software distributed under the License is distributed on an
 16  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 17  
  * KIND, either express or implied.  See the License for the
 18  
  * specific language governing permissions and limitations
 19  
  * under the License.    
 20  
  */
 21  
 
 22  
 import java.io.File;
 23  
 import java.util.HashSet;
 24  
 import java.util.Set;
 25  
 
 26  
 import org.apache.maven.plugin.MojoExecutionException;
 27  
 import org.apache.maven.plugin.dependency.utils.DependencyStatusSets;
 28  
 import org.apache.maven.plugin.dependency.utils.resolvers.ArtifactsResolver;
 29  
 import org.apache.maven.plugin.dependency.utils.resolvers.DefaultArtifactsResolver;
 30  
 import org.apache.maven.plugin.dependency.utils.translators.ArtifactTranslator;
 31  
 import org.apache.maven.plugin.dependency.utils.translators.ClassifierTypeTranslator;
 32  
 import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
 33  
 import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
 34  
 import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
 35  
 import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
 36  
 import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
 37  
 import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
 38  
 import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
 39  
 import org.apache.maven.shared.artifact.filter.collection.TransitivityFilter;
 40  
 import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
 41  
 import org.codehaus.plexus.util.StringUtils;
 42  
 
 43  
 /**
 44  
  * Class that excapusulates the plugin parameters, and contains methods that
 45  
  * handle dependency filtering
 46  
  * 
 47  
  * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
 48  
  * @version $Id: AbstractDependencyFilterMojo.java 728546 2008-12-21 22:56:51Z bentmann $
 49  
  * @see org.apache.maven.plugin.dependency.AbstractDependencyMojo
 50  
  */
 51  84
 public abstract class AbstractDependencyFilterMojo
 52  
     extends AbstractDependencyMojo
 53  
 {
 54  
     /**
 55  
      * If we should exclude transitive dependencies
 56  
      * 
 57  
      * @since 2.0
 58  
      * @optional
 59  
      * @parameter expression="${excludeTransitive}" default-value="false"
 60  
      */
 61  
     protected boolean excludeTransitive;
 62  
 
 63  
     /**
 64  
      * Comma Separated list of Types to include. Empty String indicates include
 65  
      * everything (default).
 66  
      * 
 67  
      * @since 2.0
 68  
      * @parameter expression="${includeTypes}" default-value=""
 69  
      * @optional
 70  
      */
 71  
     protected String includeTypes;
 72  
 
 73  
     /**
 74  
      * Comma Separated list of Types to exclude. Empty String indicates don't
 75  
      * exclude anything (default).
 76  
      * 
 77  
      * @since 2.0
 78  
      * @parameter expression="${excludeTypes}" default-value=""
 79  
      * @optional
 80  
      */
 81  
     protected String excludeTypes;
 82  
 
 83  
     /**
 84  
      * Scope to include. An Empty string indicates all scopes (default).
 85  
      * 
 86  
      * @since 2.0
 87  
      * @parameter expression="${includeScope}" default-value=""
 88  
      * @optional
 89  
      */
 90  
     protected String includeScope;
 91  
 
 92  
     /**
 93  
      * Scope to exclude. An Empty string indicates no scopes (default).
 94  
      * 
 95  
      * @since 2.0
 96  
      * @parameter expression="${excludeScope}" default-value=""
 97  
      * @optional
 98  
      */
 99  
     protected String excludeScope;
 100  
 
 101  
     /**
 102  
      * Comma Separated list of Classifiers to include. Empty String indicates
 103  
      * include everything (default).
 104  
      * 
 105  
      * @since 2.0
 106  
      * @parameter expression="${includeClassifiers}" default-value=""
 107  
      * @optional
 108  
      */
 109  
     protected String includeClassifiers;
 110  
 
 111  
     /**
 112  
      * Comma Separated list of Classifiers to exclude. Empty String indicates
 113  
      * don't exclude anything (default).
 114  
      * 
 115  
      * @since 2.0
 116  
      * @parameter expression="${excludeClassifiers}" default-value=""
 117  
      * @optional
 118  
      */
 119  
     protected String excludeClassifiers;
 120  
 
 121  
     /**
 122  
      * Specify classifier to look for. Example: sources
 123  
      * 
 124  
      * @optional
 125  
      * @since 2.0
 126  
      * @parameter expression="${classifier}" default-value=""
 127  
      */
 128  
     protected String classifier;
 129  
 
 130  
     /**
 131  
      * Specify type to look for when constructing artifact based on classifier.
 132  
      * Example: java-source,jar,war
 133  
      * 
 134  
      * @optional
 135  
      * @since 2.0
 136  
      * @parameter expression="${type}" default-value="java-source"
 137  
      */
 138  
     protected String type;
 139  
 
 140  
     /**
 141  
      * Comma separated list of Artifact names too exclude.
 142  
      * 
 143  
      * @since 2.0
 144  
      * @optional
 145  
      * @parameter expression="${excludeArtifactIds}" default-value=""
 146  
      */
 147  
     protected String excludeArtifactIds;
 148  
 
 149  
     /**
 150  
      * Comma separated list of Artifact names to include.
 151  
      * 
 152  
      * @since 2.0
 153  
      * @optional
 154  
      * @parameter expression="${includeArtifactIds}" default-value=""
 155  
      */
 156  
     protected String includeArtifactIds;
 157  
 
 158  
     /**
 159  
      * Comma separated list of GroupId Names to exclude.
 160  
      * 
 161  
      * @since 2.0
 162  
      * @optional
 163  
      * @parameter expression="${excludeGroupIds}" default-value=""
 164  
      */
 165  
     protected String excludeGroupIds;
 166  
 
 167  
     /**
 168  
      * Comma separated list of GroupIds to include.
 169  
      * 
 170  
      * @since 2.0
 171  
      * @optional
 172  
      * @parameter expression="${includeGroupIds}" default-value=""
 173  
      */
 174  
     protected String includeGroupIds;
 175  
 
 176  
     /**
 177  
      * Directory to store flag files
 178  
      * 
 179  
      * @parameter expression="${markersDirectory}"
 180  
      *            default-value="${project.build.directory}/dependency-maven-plugin-markers"
 181  
      * @optional
 182  
      * @since 2.0
 183  
      */
 184  
     protected File markersDirectory;
 185  
 
 186  
     /**
 187  
      * Overwrite release artifacts
 188  
      * 
 189  
      * @optional
 190  
      * @since 1.0
 191  
      * @parameter expression="${overWriteReleases}" default-value="false"
 192  
      */
 193  
     protected boolean overWriteReleases;
 194  
 
 195  
     /**
 196  
      * Overwrite snapshot artifacts
 197  
      * 
 198  
      * @optional
 199  
      * @since 1.0
 200  
      * @parameter expression="${overWriteSnapshots}" default-value="false"
 201  
      */
 202  
     protected boolean overWriteSnapshots;
 203  
 
 204  
     /**
 205  
      * Overwrite artifacts that don't exist or are older than the source.
 206  
      * 
 207  
      * @optional
 208  
      * @since 2.0
 209  
      * @parameter expression="${overWriteIfNewer}" default-value="true"
 210  
      */
 211  
     protected boolean overWriteIfNewer;
 212  
 
 213  
     protected abstract ArtifactsFilter getMarkedArtifactFilter();
 214  
 
 215  
     /**
 216  
      * Retrieves dependencies, either direct only or all including transitive.
 217  
      * 
 218  
      * @return A HashSet of artifacts
 219  
      * @throws MojoExecutionException 
 220  
      */
 221  
     protected Set getResolvedDependencies( boolean stopOnFailure )throws MojoExecutionException
 222  
 
 223  
     {
 224  4
         DependencyStatusSets status = getDependencySets( stopOnFailure );
 225  
 
 226  4
         return status.getResolvedDependencies();
 227  
     }
 228  
 
 229  
     /**
 230  
      * 
 231  
      * Method creates filters and filters the projects dependencies. This method
 232  
      * also transforms the dependencies if classifier is set. The dependencies
 233  
      * are filtered in least specific to most specific order
 234  
      * 
 235  
      * @param stopOnFailure
 236  
      * @return DependencyStatusSets - Bean of TreeSets that contains information
 237  
      *         on the projects dependencies
 238  
      * @throws MojoExecutionException 
 239  
      */
 240  
     protected DependencyStatusSets getDependencySets( boolean stopOnFailure )
 241  
         throws MojoExecutionException
 242  
     {
 243  
         // add filters in well known order, least specific to most specific
 244  102
         FilterArtifacts filter = new FilterArtifacts();
 245  
 
 246  102
         filter.addFilter( new TransitivityFilter( project.getDependencyArtifacts(), this.excludeTransitive ) );
 247  102
         filter.addFilter( new ScopeFilter( this.includeScope, this.excludeScope ) );
 248  102
         filter.addFilter( new TypeFilter( this.includeTypes, this.excludeTypes ) );
 249  102
         filter.addFilter( new ClassifierFilter( this.includeClassifiers, this.excludeClassifiers ) );
 250  102
         filter.addFilter( new GroupIdFilter( this.includeGroupIds, this.excludeGroupIds ) );
 251  102
         filter.addFilter( new ArtifactIdFilter( this.includeArtifactIds, this.excludeArtifactIds ) );
 252  
 
 253  
         // start with all artifacts.
 254  102
         Set artifacts = project.getArtifacts();
 255  
 
 256  
         // perform filtering
 257  
         try
 258  
         {
 259  102
             artifacts = filter.filter( artifacts );
 260  
         }
 261  2
         catch ( ArtifactFilterException e )
 262  
         {
 263  2
             throw new MojoExecutionException(e.getMessage(),e);
 264  100
         }
 265  
 
 266  
         // transform artifacts if classifier is set
 267  100
         DependencyStatusSets status = null;
 268  100
         if ( StringUtils.isNotEmpty( classifier ) )
 269  
         {
 270  8
             status = getClassifierTranslatedDependencies( artifacts, stopOnFailure );
 271  
         }
 272  
         else
 273  
         {
 274  92
             status = filterMarkedDependencies( artifacts );
 275  
         }
 276  
 
 277  96
         return status;
 278  
     }
 279  
 
 280  
     /**
 281  
      * 
 282  
      * Transform artifacts
 283  
      * 
 284  
      * @param artifacts
 285  
      * @param stopOnFailure
 286  
      * @return DependencyStatusSets - Bean of TreeSets that contains information
 287  
      *         on the projects dependencies
 288  
      * @throws MojoExecutionException
 289  
      */
 290  
     protected DependencyStatusSets getClassifierTranslatedDependencies( Set artifacts, boolean stopOnFailure )
 291  
         throws MojoExecutionException
 292  
     {
 293  8
         Set unResolvedArtifacts = new HashSet();
 294  8
         Set resolvedArtifacts = artifacts;
 295  8
         DependencyStatusSets status = new DependencyStatusSets();
 296  
 
 297  
         // possibly translate artifacts into a new set of artifacts based on the
 298  
         // classifier and type
 299  
         // if this did something, we need to resolve the new artifacts
 300  8
         if ( StringUtils.isNotEmpty( classifier ) )
 301  
         {
 302  8
             ArtifactTranslator translator = new ClassifierTypeTranslator( this.classifier, this.type, this.factory );
 303  8
             artifacts = translator.translate( artifacts, getLog() );
 304  
 
 305  8
             status = filterMarkedDependencies( artifacts );
 306  
 
 307  
             // the unskipped artifacts are in the resolved set.
 308  8
             artifacts = status.getResolvedDependencies();
 309  
 
 310  
             // resolve the rest of the artifacts
 311  8
             ArtifactsResolver artifactsResolver = new DefaultArtifactsResolver( this.resolver, this.local,
 312  
                                                                                 this.remoteRepos, stopOnFailure );
 313  8
             resolvedArtifacts = artifactsResolver.resolve( artifacts, getLog() );
 314  
 
 315  
             // calculate the artifacts not resolved.
 316  4
             unResolvedArtifacts.addAll( artifacts );
 317  4
             unResolvedArtifacts.removeAll( resolvedArtifacts );
 318  
         }
 319  
 
 320  
         // return a bean of all 3 sets.
 321  4
         status.setResolvedDependencies( resolvedArtifacts );
 322  4
         status.setUnResolvedDependencies( unResolvedArtifacts );
 323  
 
 324  4
         return status;
 325  
     }
 326  
 
 327  
     /**
 328  
      * Filter the marked dependencies
 329  
      * 
 330  
      * @param artifacts
 331  
      * @return
 332  
      * @throws MojoExecutionException
 333  
      */
 334  
     protected DependencyStatusSets filterMarkedDependencies( Set artifacts )
 335  
         throws MojoExecutionException
 336  
     {
 337  
         // remove files that have markers already
 338  100
         FilterArtifacts filter = new FilterArtifacts();
 339  100
         filter.clearFilters();
 340  100
         filter.addFilter( getMarkedArtifactFilter() );
 341  
 
 342  
         Set unMarkedArtifacts;
 343  
         try
 344  
         {
 345  100
             unMarkedArtifacts = filter.filter( artifacts );
 346  
         }
 347  0
         catch ( ArtifactFilterException e )
 348  
         {
 349  0
             throw new MojoExecutionException(e.getMessage(),e);
 350  100
         }
 351  
 
 352  
         // calculate the skipped artifacts
 353  100
         Set skippedArtifacts = new HashSet();
 354  100
         skippedArtifacts.addAll( artifacts );
 355  100
         skippedArtifacts.removeAll( unMarkedArtifacts );
 356  
 
 357  100
         return new DependencyStatusSets( unMarkedArtifacts, null, skippedArtifacts );
 358  
     }
 359  
 
 360  
     /**
 361  
      * @return Returns the markersDirectory.
 362  
      */
 363  
     public File getMarkersDirectory()
 364  
     {
 365  0
         return this.markersDirectory;
 366  
     }
 367  
 
 368  
     /**
 369  
      * @param theMarkersDirectory
 370  
      *            The markersDirectory to set.
 371  
      */
 372  
     public void setMarkersDirectory( File theMarkersDirectory )
 373  
     {
 374  0
         this.markersDirectory = theMarkersDirectory;
 375  0
     }
 376  
 
 377  
     // TODO: Set marker files.
 378  
 }