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

org.apache.maven.graph.effective.traverse.BuildOrderTraversal Maven / Gradle / Ivy

There is a newer version: 0.3.0
Show newest version
package org.apache.maven.graph.effective.traverse;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.maven.graph.common.RelationshipType;
import org.apache.maven.graph.common.ref.ArtifactRef;
import org.apache.maven.graph.common.ref.ProjectVersionRef;
import org.apache.maven.graph.effective.EProjectNet;
import org.apache.maven.graph.effective.rel.DependencyRelationship;
import org.apache.maven.graph.effective.rel.PluginRelationship;
import org.apache.maven.graph.effective.rel.ProjectRelationship;

public class BuildOrderTraversal
    implements ProjectNetTraversal
{

    private final List order = new ArrayList();

    private final RelationshipType[] types;

    public BuildOrderTraversal( final RelationshipType... types )
    {
        this.types = types;
        Arrays.sort( types );
    }

    public List getBuildOrder()
    {
        return order;
    }

    public TraversalType getType( final int pass )
    {
        return TraversalType.depth_first;
    }

    public int getRequiredPasses()
    {
        return 1;
    }

    public void startTraverse( final int pass, final EProjectNet network )
    {
    }

    public void endTraverse( final int pass, final EProjectNet network )
    {
    }

    public boolean traverseEdge( final ProjectRelationship relationship, final List> path,
                                 final int pass )
    {
        if ( relationship instanceof DependencyRelationship && ((DependencyRelationship)relationship).isManaged() )
        {
            return false;
        }
        
        if ( relationship instanceof PluginRelationship && ((PluginRelationship)relationship).isManaged() )
        {
            return false;
        }
        
        if ( types != null && types.length > 0 && Arrays.binarySearch( types, relationship.getType() ) < 0 )
        {
            return false;
        }

        final ProjectVersionRef decl = relationship.getDeclaring();

        ProjectVersionRef target = relationship.getTarget();
        if ( target instanceof ArtifactRef )
        {
            target = ( (ArtifactRef) target ).asProjectVersionRef();
        }

        int idx = order.indexOf( decl );
        if ( idx < 0 )
        {
            idx = 0;
            order.add( decl );
        }

        order.add( idx, target );

        return true;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy