package org.apache.maven.shared.transfer.dependencies.collect.internal;

/*
 * 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.
 */

import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;

/**
 * 
 * @author Robert Scholte
 */
public interface MavenDependencyCollector
{

    CollectorResult collectDependencies( Dependency root )
        throws DependencyCollectorException;

    CollectorResult collectDependencies( DependableCoordinate root )
        throws DependencyCollectorException;

    CollectorResult collectDependencies( Model root )
        throws DependencyCollectorException;

    CollectorResult collectDependenciesGraph( Dependency root )
        throws DependencyCollectorException;

    CollectorResult collectDependenciesGraph( DependableCoordinate root )
        throws DependencyCollectorException;

    CollectorResult collectDependenciesGraph( Model root )
        throws DependencyCollectorException;

}
