All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.felix.scrplugin.mojo.MavenProjectScanner Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.felix.scrplugin.mojo;


import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.felix.scrplugin.Log;
import org.apache.felix.scrplugin.Source;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.Scanner;
import org.sonatype.plexus.build.incremental.BuildContext;


public class MavenProjectScanner {

	private enum ScanKind {
		ADDED_OR_UPDATED, DELETED;
	}

    private final MavenProject project;

    private final String includeString;

    private final String excludeString;

    private final boolean scanClasses;
    private final Log log;

    private final BuildContext buildContext;

    public MavenProjectScanner( final BuildContext buildContext,
            final MavenProject project,
            final String includeString,
            final String excludeString,
            final boolean scanClasses,
            final Log log) {
        this.project = project;
        this.includeString = includeString;
        this.excludeString = excludeString;
        this.scanClasses = scanClasses;
        this.log = log;
        this.buildContext = buildContext;
    }

    /**
     * Return all sources.
     */
    public Collection getSources() {
    	if ( scanClasses ) {
            final ArrayList files = new ArrayList();

            final DirectoryScanner scanner = new DirectoryScanner();
            scanner.setBasedir(this.project.getBuild().getOutputDirectory());
            if ( this.includeString != null ) {
                scanner.setIncludes(this.includeString.split(","));
            } else {
                scanner.setIncludes(new String[] {"**/*.class"});
            }
            if ( this.excludeString != null ) {
                scanner.setExcludes(this.excludeString.split(","));
            }
            scanner.addDefaultExcludes();

            scanner.scan();

            for ( final String fileName : scanner.getIncludedFiles() ) {
                files.add( new Source() {

                    public File getFile() {
                        return new File(project.getBuild().getOutputDirectory(), fileName);
                    }

                    public String getClassName() {
                        // remove ".class"
                        String name = fileName.substring(0, fileName.length() - 6);
                        return name.replace(File.separatorChar, '/').replace('/', '.');
                    }
                });
            }

    	    return files;
    	}
    	return getSourcesForScanKind(ScanKind.ADDED_OR_UPDATED);
    }

	private Collection getSourcesForScanKind(ScanKind scanKind)
			throws AssertionError {
		final ArrayList files = new ArrayList();

        @SuppressWarnings("unchecked")
        final Iterator i = project.getCompileSourceRoots().iterator();

        // FELIX-509: check for excludes
        String[] includes = new String[] { "**/*.java" };
        if ( includeString != null ) {
        	includes = includeString.split( "," );
        }

        final String[] excludes;
        if ( excludeString != null ) {
            excludes = excludeString.split( "," );
        } else {
            excludes = null;
        }

        while ( i.hasNext() ) {
            final String tree = i.next();
            final File directory = new File( tree );
            if ( !directory.exists() ) {
                log.warn("Source tree does not exist. Ignoring " + tree);
                continue;
            }
            log.debug( "Scanning source tree " + tree );

            final Scanner scanner;
            switch ( scanKind ) {

            	case ADDED_OR_UPDATED:
            		scanner = this.buildContext.newScanner(directory, false);
            		break;

            	case DELETED:
            		scanner = this.buildContext.newDeleteScanner(directory);
            		break;

            	default:
            		throw new AssertionError("Unhandled ScanKind " + scanKind);

            }


            if ( excludes != null && excludes.length > 0 ) {
                scanner.setExcludes( excludes );
            }
            scanner.addDefaultExcludes();
            scanner.setIncludes( includes );

            scanner.scan();

            for ( final String fileName : scanner.getIncludedFiles() ) {
                files.add( new Source() {

                    public File getFile() {
                        return new File(directory, fileName);
                    }

                    public String getClassName() {
                        // remove ".java"
                        String name = fileName.substring(0, fileName.length() - 5);
                        return name.replace(File.separatorChar, '/').replace('/', '.');
                    }
                });
            }
        }

        return files;
	}

	/**
	 * Returns all sources which were deleted since the previous build
	 *
	 * @return the deleted sources
	 */
    public Collection getDeletedSources() {

    	return getSourcesForScanKind(ScanKind.DELETED);
    }

    /**
     * Return all dependencies
     */
    public List getDependencies() {
        final ArrayList dependencies = new ArrayList();

        @SuppressWarnings("unchecked")
        final Iterator it = project.getArtifacts().iterator();
        while ( it.hasNext() ) {
            final Artifact declared = it.next();
            this.log.debug( "Checking artifact " + declared );
            if ( this.isJavaArtifact( declared ) ) {
                if ( Artifact.SCOPE_COMPILE.equals( declared.getScope() )
                    || Artifact.SCOPE_RUNTIME.equals( declared.getScope() )
                    || Artifact.SCOPE_PROVIDED.equals( declared.getScope() )
                    || Artifact.SCOPE_SYSTEM.equals( declared.getScope() ) ) {
                    this.log.debug( "Resolving artifact " + declared );
                    if ( declared.getFile() != null ) {
                        dependencies.add( declared.getFile() );
                    } else {
                        this.log.debug( "Unable to resolve artifact " + declared );
                    }
                } else {
                    this.log.debug( "Artifact " + declared + " has not scope compile or runtime, but "
                        + declared.getScope() );
                }
            } else {
                this.log.debug( "Artifact " + declared + " is not a java artifact, type is " + declared.getType() );
            }
        }

        return dependencies;
    }


    /**
     * Check if the artifact is a java artifact (jar or bundle)
     */
    private boolean isJavaArtifact( Artifact artifact ) {
        if ( "jar".equals( artifact.getType() ) ) {
            return true;
        }
        if ( "bundle".equals( artifact.getType() ) ) {
            return true;
        }
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy