package org.apache.maven.shared.artifact.filter.resolve.transform;

/*
 * 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 java.util.ArrayList;
import java.util.List;

import org.apache.maven.shared.artifact.filter.resolve.Node;
import org.eclipse.aether.artifact.ArtifactProperties;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.graph.Exclusion;

/**
 * Adapter of an Eclipse Aether DependencyNode for common Node 
 * 
 * @author Robert Scholte
 * @since 3.0
 */
class EclipseAetherNode implements Node
{

    private final DependencyNode node;

    EclipseAetherNode( DependencyNode node )
    {
        this.node = node;
    }

    @Override
    public org.apache.maven.model.Dependency getDependency()
    {
        Dependency nodeDependency = node.getDependency();

        if ( nodeDependency == null )
        {
            return null;
        }

        org.apache.maven.model.Dependency mavenDependency = new org.apache.maven.model.Dependency();
        mavenDependency.setGroupId( nodeDependency.getArtifact().getGroupId() );
        mavenDependency.setArtifactId( nodeDependency.getArtifact().getArtifactId() );
        mavenDependency.setVersion( nodeDependency.getArtifact().getVersion() );
        mavenDependency.setClassifier( nodeDependency.getArtifact().getClassifier() );
        mavenDependency.setType( nodeDependency.getArtifact().getProperty( ArtifactProperties.TYPE, null ) );
        mavenDependency.setScope( nodeDependency.getScope() );
        // Eclipse Aether supports three-valued logic
        if ( nodeDependency.getOptional() != null )
        {
            mavenDependency.setOptional( nodeDependency.isOptional() );
        }
        if ( nodeDependency.getExclusions() != null )
        {
            List<org.apache.maven.model.Exclusion> mavenExclusions =
                new ArrayList<org.apache.maven.model.Exclusion>( nodeDependency.getExclusions().size() );

            for ( Exclusion aetherExclusion : nodeDependency.getExclusions() )
            {
                org.apache.maven.model.Exclusion mavenExclusion = new org.apache.maven.model.Exclusion();

                mavenExclusion.setGroupId( aetherExclusion.getGroupId() );
                mavenExclusion.setArtifactId( aetherExclusion.getArtifactId() );
                // that's all folks, although Aether has more metadata

                mavenExclusions.add( mavenExclusion );
            }

            mavenDependency.setExclusions( mavenExclusions );
        }

        return mavenDependency;
    }
     
}
