001package org.eclipse.aether.internal.impl.collect;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.eclipse.aether.artifact.Artifact;
023import org.eclipse.aether.collection.DependencyManagement;
024import org.eclipse.aether.collection.DependencyManager;
025import org.eclipse.aether.graph.DefaultDependencyNode;
026import org.eclipse.aether.graph.Dependency;
027import org.eclipse.aether.graph.DependencyNode;
028import org.eclipse.aether.graph.Exclusion;
029import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
030
031import java.util.ArrayList;
032import java.util.Collection;
033import java.util.Collections;
034import java.util.HashMap;
035import java.util.Map;
036
037/**
038 * Helper class used during collection.
039 */
040public class PremanagedDependency
041{
042
043    final String premanagedVersion;
044
045    final String premanagedScope;
046
047    final Boolean premanagedOptional;
048
049    /**
050     * @since 1.1.0
051     */
052    final Collection<Exclusion> premanagedExclusions;
053
054    /**
055     * @since 1.1.0
056     */
057    final Map<String, String> premanagedProperties;
058
059    final int managedBits;
060
061    final Dependency managedDependency;
062
063    final boolean premanagedState;
064
065    @SuppressWarnings( "checkstyle:parameternumber" )
066    PremanagedDependency( String premanagedVersion, String premanagedScope, Boolean premanagedOptional,
067                          Collection<Exclusion> premanagedExclusions, Map<String, String> premanagedProperties,
068                          int managedBits, Dependency managedDependency, boolean premanagedState )
069    {
070        this.premanagedVersion = premanagedVersion;
071        this.premanagedScope = premanagedScope;
072        this.premanagedOptional = premanagedOptional;
073        this.premanagedExclusions =
074                premanagedExclusions != null
075                        ? Collections.unmodifiableCollection( new ArrayList<>( premanagedExclusions ) )
076                        : null;
077
078        this.premanagedProperties =
079                premanagedProperties != null
080                        ? Collections.unmodifiableMap( new HashMap<>( premanagedProperties ) )
081                        : null;
082
083        this.managedBits = managedBits;
084        this.managedDependency = managedDependency;
085        this.premanagedState = premanagedState;
086    }
087
088    public static PremanagedDependency create( DependencyManager depManager, Dependency dependency,
089                                               boolean disableVersionManagement, boolean premanagedState )
090    {
091        DependencyManagement depMngt = depManager != null ? depManager.manageDependency( dependency ) : null;
092
093        int managedBits = 0;
094        String premanagedVersion = null;
095        String premanagedScope = null;
096        Boolean premanagedOptional = null;
097        Collection<Exclusion> premanagedExclusions = null;
098        Map<String, String> premanagedProperties = null;
099
100        if ( depMngt != null )
101        {
102            if ( depMngt.getVersion() != null && !disableVersionManagement )
103            {
104                Artifact artifact = dependency.getArtifact();
105                premanagedVersion = artifact.getVersion();
106                dependency = dependency.setArtifact( artifact.setVersion( depMngt.getVersion() ) );
107                managedBits |= DependencyNode.MANAGED_VERSION;
108            }
109            if ( depMngt.getProperties() != null )
110            {
111                Artifact artifact = dependency.getArtifact();
112                premanagedProperties = artifact.getProperties();
113                dependency = dependency.setArtifact( artifact.setProperties( depMngt.getProperties() ) );
114                managedBits |= DependencyNode.MANAGED_PROPERTIES;
115            }
116            if ( depMngt.getScope() != null )
117            {
118                premanagedScope = dependency.getScope();
119                dependency = dependency.setScope( depMngt.getScope() );
120                managedBits |= DependencyNode.MANAGED_SCOPE;
121            }
122            if ( depMngt.getOptional() != null )
123            {
124                premanagedOptional = dependency.isOptional();
125                dependency = dependency.setOptional( depMngt.getOptional() );
126                managedBits |= DependencyNode.MANAGED_OPTIONAL;
127            }
128            if ( depMngt.getExclusions() != null )
129            {
130                premanagedExclusions = dependency.getExclusions();
131                dependency = dependency.setExclusions( depMngt.getExclusions() );
132                managedBits |= DependencyNode.MANAGED_EXCLUSIONS;
133            }
134        }
135        return new PremanagedDependency( premanagedVersion, premanagedScope, premanagedOptional,
136                premanagedExclusions, premanagedProperties, managedBits, dependency,
137                premanagedState );
138
139    }
140
141    public Dependency getManagedDependency()
142    {
143        return managedDependency;
144    }
145
146    public void applyTo( DefaultDependencyNode child )
147    {
148        child.setManagedBits( managedBits );
149        if ( premanagedState )
150        {
151            child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_VERSION, premanagedVersion );
152            child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_SCOPE, premanagedScope );
153            child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_OPTIONAL, premanagedOptional );
154            child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_EXCLUSIONS, premanagedExclusions );
155            child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_PROPERTIES, premanagedProperties );
156        }
157    }
158
159}