http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java deleted file mode 100644 index f2a7e38..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java +++ /dev/null @@ -1,206 +0,0 @@ -package org.eclipse.aether.util.graph.selector; - -/* - * 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.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Set; - -import org.eclipse.aether.collection.DependencyCollectionContext; -import org.eclipse.aether.collection.DependencySelector; -import org.eclipse.aether.graph.Dependency; - -/** - * A dependency selector that combines zero or more other selectors using a logical {@code AND}. The resulting selector - * selects a given dependency if and only if all constituent selectors do so. - */ -public final class AndDependencySelector - implements DependencySelector -{ - - private final Set<? extends DependencySelector> selectors; - - private int hashCode; - - /** - * Creates a new selector from the specified selectors. Prefer - * {@link #newInstance(DependencySelector, DependencySelector)} if any of the input selectors might be {@code null}. - * - * @param selectors The selectors to combine, may be {@code null} but must not contain {@code null} elements. - */ - public AndDependencySelector( DependencySelector... selectors ) - { - if ( selectors != null && selectors.length > 0 ) - { - this.selectors = new LinkedHashSet<DependencySelector>( Arrays.asList( selectors ) ); - } - else - { - this.selectors = Collections.emptySet(); - } - } - - /** - * Creates a new selector from the specified selectors. - * - * @param selectors The selectors to combine, may be {@code null} but must not contain {@code null} elements. - */ - public AndDependencySelector( Collection<? extends DependencySelector> selectors ) - { - if ( selectors != null && !selectors.isEmpty() ) - { - this.selectors = new LinkedHashSet<DependencySelector>( selectors ); - } - else - { - this.selectors = Collections.emptySet(); - } - } - - private AndDependencySelector( Set<DependencySelector> selectors ) - { - if ( selectors != null && !selectors.isEmpty() ) - { - this.selectors = selectors; - } - else - { - this.selectors = Collections.emptySet(); - } - } - - /** - * Creates a new selector from the specified selectors. - * - * @param selector1 The first selector to combine, may be {@code null}. - * @param selector2 The second selector to combine, may be {@code null}. - * @return The combined selector or {@code null} if both selectors were {@code null}. - */ - public static DependencySelector newInstance( DependencySelector selector1, DependencySelector selector2 ) - { - if ( selector1 == null ) - { - return selector2; - } - else if ( selector2 == null || selector2.equals( selector1 ) ) - { - return selector1; - } - return new AndDependencySelector( selector1, selector2 ); - } - - public boolean selectDependency( Dependency dependency ) - { - for ( DependencySelector selector : selectors ) - { - if ( !selector.selectDependency( dependency ) ) - { - return false; - } - } - return true; - } - - public DependencySelector deriveChildSelector( DependencyCollectionContext context ) - { - int seen = 0; - Set<DependencySelector> childSelectors = null; - - for ( DependencySelector selector : selectors ) - { - DependencySelector childSelector = selector.deriveChildSelector( context ); - if ( childSelectors != null ) - { - if ( childSelector != null ) - { - childSelectors.add( childSelector ); - } - } - else if ( selector != childSelector ) - { - childSelectors = new LinkedHashSet<DependencySelector>(); - if ( seen > 0 ) - { - for ( DependencySelector s : selectors ) - { - if ( childSelectors.size() >= seen ) - { - break; - } - childSelectors.add( s ); - } - } - if ( childSelector != null ) - { - childSelectors.add( childSelector ); - } - } - else - { - seen++; - } - } - - if ( childSelectors == null ) - { - return this; - } - if ( childSelectors.size() <= 1 ) - { - if ( childSelectors.isEmpty() ) - { - return null; - } - return childSelectors.iterator().next(); - } - return new AndDependencySelector( childSelectors ); - } - - @Override - public boolean equals( Object obj ) - { - if ( this == obj ) - { - return true; - } - else if ( null == obj || !getClass().equals( obj.getClass() ) ) - { - return false; - } - - AndDependencySelector that = (AndDependencySelector) obj; - return selectors.equals( that.selectors ); - } - - @Override - public int hashCode() - { - if ( hashCode == 0 ) - { - int hash = 17; - hash = hash * 31 + selectors.hashCode(); - hashCode = hash; - } - return hashCode; - } - -}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java deleted file mode 100644 index 221cf4f..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java +++ /dev/null @@ -1,227 +0,0 @@ -package org.eclipse.aether.util.graph.selector; - -/* - * 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.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.TreeSet; - -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.collection.DependencyCollectionContext; -import org.eclipse.aether.collection.DependencySelector; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.graph.Exclusion; - -/** - * A dependency selector that applies exclusions based on artifact coordinates. - * - * @see Dependency#getExclusions() - */ -public final class ExclusionDependencySelector - implements DependencySelector -{ - - // sorted and dupe-free array, faster to iterate than LinkedHashSet - private final Exclusion[] exclusions; - - private int hashCode; - - /** - * Creates a new selector without any exclusions. - */ - public ExclusionDependencySelector() - { - this.exclusions = new Exclusion[0]; - } - - /** - * Creates a new selector with the specified exclusions. - * - * @param exclusions The exclusions, may be {@code null}. - */ - public ExclusionDependencySelector( Collection<Exclusion> exclusions ) - { - if ( exclusions != null && !exclusions.isEmpty() ) - { - TreeSet<Exclusion> sorted = new TreeSet<Exclusion>( ExclusionComparator.INSTANCE ); - sorted.addAll( exclusions ); - this.exclusions = sorted.toArray( new Exclusion[sorted.size()] ); - } - else - { - this.exclusions = new Exclusion[0]; - } - } - - private ExclusionDependencySelector( Exclusion[] exclusions ) - { - this.exclusions = exclusions; - } - - public boolean selectDependency( Dependency dependency ) - { - Artifact artifact = dependency.getArtifact(); - for ( Exclusion exclusion : exclusions ) - { - if ( matches( exclusion, artifact ) ) - { - return false; - } - } - return true; - } - - private boolean matches( Exclusion exclusion, Artifact artifact ) - { - if ( !matches( exclusion.getArtifactId(), artifact.getArtifactId() ) ) - { - return false; - } - if ( !matches( exclusion.getGroupId(), artifact.getGroupId() ) ) - { - return false; - } - if ( !matches( exclusion.getExtension(), artifact.getExtension() ) ) - { - return false; - } - if ( !matches( exclusion.getClassifier(), artifact.getClassifier() ) ) - { - return false; - } - return true; - } - - private boolean matches( String pattern, String value ) - { - return "*".equals( pattern ) || pattern.equals( value ); - } - - public DependencySelector deriveChildSelector( DependencyCollectionContext context ) - { - Dependency dependency = context.getDependency(); - Collection<Exclusion> exclusions = ( dependency != null ) ? dependency.getExclusions() : null; - if ( exclusions == null || exclusions.isEmpty() ) - { - return this; - } - - Exclusion[] merged = this.exclusions; - int count = merged.length; - for ( Exclusion exclusion : exclusions ) - { - int index = Arrays.binarySearch( merged, exclusion, ExclusionComparator.INSTANCE ); - if ( index < 0 ) - { - index = -( index + 1 ); - if ( count >= merged.length ) - { - Exclusion[] tmp = new Exclusion[merged.length + exclusions.size()]; - System.arraycopy( merged, 0, tmp, 0, index ); - tmp[index] = exclusion; - System.arraycopy( merged, index, tmp, index + 1, count - index ); - merged = tmp; - } - else - { - System.arraycopy( merged, index, merged, index + 1, count - index ); - merged[index] = exclusion; - } - count++; - } - } - if ( merged == this.exclusions ) - { - return this; - } - if ( merged.length != count ) - { - Exclusion[] tmp = new Exclusion[count]; - System.arraycopy( merged, 0, tmp, 0, count ); - merged = tmp; - } - - return new ExclusionDependencySelector( merged ); - } - - @Override - public boolean equals( Object obj ) - { - if ( this == obj ) - { - return true; - } - else if ( null == obj || !getClass().equals( obj.getClass() ) ) - { - return false; - } - - ExclusionDependencySelector that = (ExclusionDependencySelector) obj; - return Arrays.equals( exclusions, that.exclusions ); - } - - @Override - public int hashCode() - { - if ( hashCode == 0 ) - { - int hash = getClass().hashCode(); - hash = hash * 31 + Arrays.hashCode( exclusions ); - hashCode = hash; - } - return hashCode; - } - - private static class ExclusionComparator - implements Comparator<Exclusion> - { - - static final ExclusionComparator INSTANCE = new ExclusionComparator(); - - public int compare( Exclusion e1, Exclusion e2 ) - { - if ( e1 == null ) - { - return ( e2 == null ) ? 0 : 1; - } - else if ( e2 == null ) - { - return -1; - } - int rel = e1.getArtifactId().compareTo( e2.getArtifactId() ); - if ( rel == 0 ) - { - rel = e1.getGroupId().compareTo( e2.getGroupId() ); - if ( rel == 0 ) - { - rel = e1.getExtension().compareTo( e2.getExtension() ); - if ( rel == 0 ) - { - rel = e1.getClassifier().compareTo( e2.getClassifier() ); - } - } - } - return rel; - } - - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java deleted file mode 100644 index 69bbda4..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.eclipse.aether.util.graph.selector; - -/* - * 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.eclipse.aether.collection.DependencyCollectionContext; -import org.eclipse.aether.collection.DependencySelector; -import org.eclipse.aether.graph.Dependency; - -/** - * A dependency selector that excludes optional dependencies which occur beyond level one of the dependency graph. - * - * @see Dependency#isOptional() - */ -public final class OptionalDependencySelector - implements DependencySelector -{ - - private final int depth; - - /** - * Creates a new selector to exclude optional transitive dependencies. - */ - public OptionalDependencySelector() - { - depth = 0; - } - - private OptionalDependencySelector( int depth ) - { - this.depth = depth; - } - - public boolean selectDependency( Dependency dependency ) - { - return depth < 2 || !dependency.isOptional(); - } - - public DependencySelector deriveChildSelector( DependencyCollectionContext context ) - { - if ( depth >= 2 ) - { - return this; - } - - return new OptionalDependencySelector( depth + 1 ); - } - - @Override - public boolean equals( Object obj ) - { - if ( this == obj ) - { - return true; - } - else if ( null == obj || !getClass().equals( obj.getClass() ) ) - { - return false; - } - - OptionalDependencySelector that = (OptionalDependencySelector) obj; - return depth == that.depth; - } - - @Override - public int hashCode() - { - int hash = getClass().hashCode(); - hash = hash * 31 + depth; - return hash; - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java deleted file mode 100644 index 552fc09..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.eclipse.aether.util.graph.selector; - -/* - * 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.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.TreeSet; - -import org.eclipse.aether.collection.DependencyCollectionContext; -import org.eclipse.aether.collection.DependencySelector; -import org.eclipse.aether.graph.Dependency; - -/** - * A dependency selector that filters transitive dependencies based on their scope. Direct dependencies are always - * included regardless of their scope. <em>Note:</em> This filter does not assume any relationships between the scopes. - * In particular, the filter is not aware of scopes that logically include other scopes. - * - * @see Dependency#getScope() - */ -public final class ScopeDependencySelector - implements DependencySelector -{ - - private final boolean transitive; - - private final Collection<String> included; - - private final Collection<String> excluded; - - /** - * Creates a new selector using the specified includes and excludes. - * - * @param included The set of scopes to include, may be {@code null} or empty to include any scope. - * @param excluded The set of scopes to exclude, may be {@code null} or empty to exclude no scope. - */ - public ScopeDependencySelector( Collection<String> included, Collection<String> excluded ) - { - transitive = false; - this.included = clone( included ); - this.excluded = clone( excluded ); - } - - private static Collection<String> clone( Collection<String> scopes ) - { - Collection<String> copy; - if ( scopes == null || scopes.isEmpty() ) - { - // checking for null is faster than isEmpty() - copy = null; - } - else - { - copy = new HashSet<String>( scopes ); - if ( copy.size() <= 2 ) - { - // contains() is faster for smallish array (sorted for equals()!) - copy = new ArrayList<String>( new TreeSet<String>( copy ) ); - } - } - return copy; - } - - /** - * Creates a new selector using the specified excludes. - * - * @param excluded The set of scopes to exclude, may be {@code null} or empty to exclude no scope. - */ - public ScopeDependencySelector( String... excluded ) - { - this( null, ( excluded != null ) ? Arrays.asList( excluded ) : null ); - } - - private ScopeDependencySelector( boolean transitive, Collection<String> included, Collection<String> excluded ) - { - this.transitive = transitive; - this.included = included; - this.excluded = excluded; - } - - public boolean selectDependency( Dependency dependency ) - { - if ( !transitive ) - { - return true; - } - - String scope = dependency.getScope(); - return ( included == null || included.contains( scope ) ) && ( excluded == null || !excluded.contains( scope ) ); - } - - public DependencySelector deriveChildSelector( DependencyCollectionContext context ) - { - if ( this.transitive || context.getDependency() == null ) - { - return this; - } - - return new ScopeDependencySelector( true, included, excluded ); - } - - @Override - public boolean equals( Object obj ) - { - if ( this == obj ) - { - return true; - } - else if ( null == obj || !getClass().equals( obj.getClass() ) ) - { - return false; - } - - ScopeDependencySelector that = (ScopeDependencySelector) obj; - return transitive == that.transitive && eq( included, that.included ) && eq( excluded, that.excluded ); - } - - private static <T> boolean eq( T o1, T o2 ) - { - return ( o1 != null ) ? o1.equals( o2 ) : o2 == null; - } - - @Override - public int hashCode() - { - int hash = 17; - hash = hash * 31 + ( transitive ? 1 : 0 ); - hash = hash * 31 + ( included != null ? included.hashCode() : 0 ); - hash = hash * 31 + ( excluded != null ? excluded.hashCode() : 0 ); - return hash; - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java deleted file mode 100644 index 41ce0e0..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.eclipse.aether.util.graph.selector; - -/* - * 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.eclipse.aether.collection.DependencyCollectionContext; -import org.eclipse.aether.collection.DependencySelector; -import org.eclipse.aether.graph.Dependency; - -/** - * A dependency selector that always includes or excludes dependencies. - */ -public final class StaticDependencySelector - implements DependencySelector -{ - - private final boolean select; - - /** - * Creates a new selector with the specified selection behavior. - * - * @param select {@code true} to select all dependencies, {@code false} to exclude all dependencies. - */ - public StaticDependencySelector( boolean select ) - { - this.select = select; - } - - public boolean selectDependency( Dependency dependency ) - { - return select; - } - - public DependencySelector deriveChildSelector( DependencyCollectionContext context ) - { - return this; - } - - @Override - public boolean equals( Object obj ) - { - if ( this == obj ) - { - return true; - } - else if ( null == obj || !getClass().equals( obj.getClass() ) ) - { - return false; - } - - StaticDependencySelector that = (StaticDependencySelector) obj; - return select == that.select; - } - - @Override - public int hashCode() - { - int hash = getClass().hashCode(); - hash = hash * 31 + ( select ? 1 : 0 ); - return hash; - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/package-info.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/package-info.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/package-info.java deleted file mode 100644 index 3c3cf3c..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/selector/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -// CHECKSTYLE_OFF: RegexpHeader -/* - * 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. - */ -/** - * Various dependency selectors for building a dependency graph. - */ -package org.eclipse.aether.util.graph.selector; - http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java deleted file mode 100644 index d7f1771..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.eclipse.aether.util.graph.transformer; - -/* - * 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.eclipse.aether.RepositoryException; -import org.eclipse.aether.collection.DependencyGraphTransformationContext; -import org.eclipse.aether.collection.DependencyGraphTransformer; -import org.eclipse.aether.graph.DependencyNode; - -/** - * A dependency graph transformer that chains other transformers. - */ -public final class ChainedDependencyGraphTransformer - implements DependencyGraphTransformer -{ - - private final DependencyGraphTransformer[] transformers; - - /** - * Creates a new transformer that chains the specified transformers. - * - * @param transformers The transformers to chain, may be {@code null} or empty. - */ - public ChainedDependencyGraphTransformer( DependencyGraphTransformer... transformers ) - { - if ( transformers == null ) - { - this.transformers = new DependencyGraphTransformer[0]; - } - else - { - this.transformers = transformers; - } - } - - /** - * Creates a new transformer that chains the specified transformers or simply returns one of them if the other one - * is {@code null}. - * - * @param transformer1 The first transformer of the chain, may be {@code null}. - * @param transformer2 The second transformer of the chain, may be {@code null}. - * @return The chained transformer or {@code null} if both input transformers are {@code null}. - */ - public static DependencyGraphTransformer newInstance( DependencyGraphTransformer transformer1, - DependencyGraphTransformer transformer2 ) - { - if ( transformer1 == null ) - { - return transformer2; - } - else if ( transformer2 == null ) - { - return transformer1; - } - return new ChainedDependencyGraphTransformer( transformer1, transformer2 ); - } - - public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context ) - throws RepositoryException - { - for ( DependencyGraphTransformer transformer : transformers ) - { - node = transformer.transformGraph( node, context ); - } - return node; - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java deleted file mode 100644 index c2122fa..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java +++ /dev/null @@ -1,370 +0,0 @@ -package org.eclipse.aether.util.graph.transformer; - -/* - * 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.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.IdentityHashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.aether.RepositoryException; -import org.eclipse.aether.collection.DependencyGraphTransformationContext; -import org.eclipse.aether.collection.DependencyGraphTransformer; -import org.eclipse.aether.graph.DependencyNode; - -/** - * A dependency graph transformer that creates a topological sorting of the conflict ids which have been assigned to the - * dependency nodes. Conflict ids are sorted according to the dependency relation induced by the dependency graph. This - * transformer will query the key {@link TransformationContextKeys#CONFLICT_IDS} in the transformation context for an - * existing mapping of nodes to their conflicts ids. In absence of this map, the transformer will automatically invoke - * the {@link ConflictMarker} to calculate the conflict ids. When this transformer has executed, the transformation - * context holds a {@code List<Object>} that denotes the topologically sorted conflict ids. The list will be stored - * using the key {@link TransformationContextKeys#SORTED_CONFLICT_IDS}. In addition, the transformer will store a - * {@code Collection<Collection<Object>>} using the key {@link TransformationContextKeys#CYCLIC_CONFLICT_IDS} that - * describes cycles among conflict ids. - */ -public final class ConflictIdSorter - implements DependencyGraphTransformer -{ - - public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context ) - throws RepositoryException - { - Map<?, ?> conflictIds = (Map<?, ?>) context.get( TransformationContextKeys.CONFLICT_IDS ); - if ( conflictIds == null ) - { - ConflictMarker marker = new ConflictMarker(); - marker.transformGraph( node, context ); - - conflictIds = (Map<?, ?>) context.get( TransformationContextKeys.CONFLICT_IDS ); - } - - @SuppressWarnings( "unchecked" ) - Map<String, Object> stats = (Map<String, Object>) context.get( TransformationContextKeys.STATS ); - long time1 = System.currentTimeMillis(); - - Map<Object, ConflictId> ids = new LinkedHashMap<Object, ConflictId>( 256 ); - - { - ConflictId id = null; - Object key = conflictIds.get( node ); - if ( key != null ) - { - id = new ConflictId( key, 0 ); - ids.put( key, id ); - } - - Map<DependencyNode, Object> visited = new IdentityHashMap<DependencyNode, Object>( conflictIds.size() ); - - buildConflitIdDAG( ids, node, id, 0, visited, conflictIds ); - } - - long time2 = System.currentTimeMillis(); - - int cycles = topsortConflictIds( ids.values(), context ); - - if ( stats != null ) - { - long time3 = System.currentTimeMillis(); - stats.put( "ConflictIdSorter.graphTime", time2 - time1 ); - stats.put( "ConflictIdSorter.topsortTime", time3 - time2 ); - stats.put( "ConflictIdSorter.conflictIdCount", ids.size() ); - stats.put( "ConflictIdSorter.conflictIdCycleCount", cycles ); - } - - return node; - } - - private void buildConflitIdDAG( Map<Object, ConflictId> ids, DependencyNode node, ConflictId id, int depth, - Map<DependencyNode, Object> visited, Map<?, ?> conflictIds ) - { - if ( visited.put( node, Boolean.TRUE ) != null ) - { - return; - } - - depth++; - - for ( DependencyNode child : node.getChildren() ) - { - Object key = conflictIds.get( child ); - ConflictId childId = ids.get( key ); - if ( childId == null ) - { - childId = new ConflictId( key, depth ); - ids.put( key, childId ); - } - else - { - childId.pullup( depth ); - } - - if ( id != null ) - { - id.add( childId ); - } - - buildConflitIdDAG( ids, child, childId, depth, visited, conflictIds ); - } - } - - private int topsortConflictIds( Collection<ConflictId> conflictIds, DependencyGraphTransformationContext context ) - { - List<Object> sorted = new ArrayList<Object>( conflictIds.size() ); - - RootQueue roots = new RootQueue( conflictIds.size() / 2 ); - for ( ConflictId id : conflictIds ) - { - if ( id.inDegree <= 0 ) - { - roots.add( id ); - } - } - - processRoots( sorted, roots ); - - boolean cycle = sorted.size() < conflictIds.size(); - - while ( sorted.size() < conflictIds.size() ) - { - // cycle -> deal gracefully with nodes still having positive in-degree - - ConflictId nearest = null; - for ( ConflictId id : conflictIds ) - { - if ( id.inDegree <= 0 ) - { - continue; - } - if ( nearest == null || id.minDepth < nearest.minDepth - || ( id.minDepth == nearest.minDepth && id.inDegree < nearest.inDegree ) ) - { - nearest = id; - } - } - - nearest.inDegree = 0; - roots.add( nearest ); - - processRoots( sorted, roots ); - } - - Collection<Collection<Object>> cycles = Collections.emptySet(); - if ( cycle ) - { - cycles = findCycles( conflictIds ); - } - - context.put( TransformationContextKeys.SORTED_CONFLICT_IDS, sorted ); - context.put( TransformationContextKeys.CYCLIC_CONFLICT_IDS, cycles ); - - return cycles.size(); - } - - private void processRoots( List<Object> sorted, RootQueue roots ) - { - while ( !roots.isEmpty() ) - { - ConflictId root = roots.remove(); - - sorted.add( root.key ); - - for ( ConflictId child : root.children ) - { - child.inDegree--; - if ( child.inDegree == 0 ) - { - roots.add( child ); - } - } - } - } - - private Collection<Collection<Object>> findCycles( Collection<ConflictId> conflictIds ) - { - Collection<Collection<Object>> cycles = new HashSet<Collection<Object>>(); - - Map<Object, Integer> stack = new HashMap<Object, Integer>( 128 ); - Map<ConflictId, Object> visited = new IdentityHashMap<ConflictId, Object>( conflictIds.size() ); - for ( ConflictId id : conflictIds ) - { - findCycles( id, visited, stack, cycles ); - } - - return cycles; - } - - private void findCycles( ConflictId id, Map<ConflictId, Object> visited, Map<Object, Integer> stack, - Collection<Collection<Object>> cycles ) - { - Integer depth = stack.put( id.key, stack.size() ); - if ( depth != null ) - { - stack.put( id.key, depth ); - Collection<Object> cycle = new HashSet<Object>(); - for ( Map.Entry<Object, Integer> entry : stack.entrySet() ) - { - if ( entry.getValue() >= depth ) - { - cycle.add( entry.getKey() ); - } - } - cycles.add( cycle ); - } - else - { - if ( visited.put( id, Boolean.TRUE ) == null ) - { - for ( ConflictId childId : id.children ) - { - findCycles( childId, visited, stack, cycles ); - } - } - stack.remove( id.key ); - } - } - - static final class ConflictId - { - - final Object key; - - Collection<ConflictId> children = Collections.emptySet(); - - int inDegree; - - int minDepth; - - public ConflictId( Object key, int depth ) - { - this.key = key; - this.minDepth = depth; - } - - public void add( ConflictId child ) - { - if ( children.isEmpty() ) - { - children = new HashSet<ConflictId>(); - } - if ( children.add( child ) ) - { - child.inDegree++; - } - } - - public void pullup( int depth ) - { - if ( depth < minDepth ) - { - minDepth = depth; - depth++; - for ( ConflictId child : children ) - { - child.pullup( depth ); - } - } - } - - @Override - public boolean equals( Object obj ) - { - if ( this == obj ) - { - return true; - } - else if ( !( obj instanceof ConflictId ) ) - { - return false; - } - ConflictId that = (ConflictId) obj; - return this.key.equals( that.key ); - } - - @Override - public int hashCode() - { - return key.hashCode(); - } - - @Override - public String toString() - { - return key + " @ " + minDepth + " <" + inDegree; - } - - } - - static final class RootQueue - { - - private int nextOut; - - private int nextIn; - - private ConflictId[] ids; - - RootQueue( int capacity ) - { - ids = new ConflictId[capacity + 16]; - } - - boolean isEmpty() - { - return nextOut >= nextIn; - } - - void add( ConflictId id ) - { - if ( nextOut >= nextIn && nextOut > 0 ) - { - nextIn -= nextOut; - nextOut = 0; - } - if ( nextIn >= ids.length ) - { - ConflictId[] tmp = new ConflictId[ids.length + ids.length / 2 + 16]; - System.arraycopy( ids, nextOut, tmp, 0, nextIn - nextOut ); - ids = tmp; - nextIn -= nextOut; - nextOut = 0; - } - int i; - for ( i = nextIn - 1; i >= nextOut && id.minDepth < ids[i].minDepth; i-- ) - { - ids[i + 1] = ids[i]; - } - ids[i + 1] = id; - nextIn++; - } - - ConflictId remove() - { - return ids[nextOut++]; - } - - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java ---------------------------------------------------------------------- diff --git a/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java b/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java deleted file mode 100644 index a3fb483..0000000 --- a/aether-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java +++ /dev/null @@ -1,315 +0,0 @@ -package org.eclipse.aether.util.graph.transformer; - -/* - * 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.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Set; - -import org.eclipse.aether.RepositoryException; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.collection.DependencyGraphTransformationContext; -import org.eclipse.aether.collection.DependencyGraphTransformer; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.graph.DependencyNode; - -/** - * A dependency graph transformer that identifies conflicting dependencies. When this transformer has executed, the - * transformation context holds a {@code Map<DependencyNode, Object>} where dependency nodes that belong to the same - * conflict group will have an equal conflict identifier. This map is stored using the key - * {@link TransformationContextKeys#CONFLICT_IDS}. - */ -public final class ConflictMarker - implements DependencyGraphTransformer -{ - - /** - * After the execution of this method, every DependencyNode with an attached dependency is member of one conflict - * group. - * - * @see DependencyGraphTransformer#transformGraph(DependencyNode, DependencyGraphTransformationContext) - */ - public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context ) - throws RepositoryException - { - @SuppressWarnings( "unchecked" ) - Map<String, Object> stats = (Map<String, Object>) context.get( TransformationContextKeys.STATS ); - long time1 = System.currentTimeMillis(); - - Map<DependencyNode, Object> nodes = new IdentityHashMap<DependencyNode, Object>( 1024 ); - Map<Object, ConflictGroup> groups = new HashMap<Object, ConflictGroup>( 1024 ); - - analyze( node, nodes, groups, new int[] { 0 } ); - - long time2 = System.currentTimeMillis(); - - Map<DependencyNode, Object> conflictIds = mark( nodes.keySet(), groups ); - - context.put( TransformationContextKeys.CONFLICT_IDS, conflictIds ); - - if ( stats != null ) - { - long time3 = System.currentTimeMillis(); - stats.put( "ConflictMarker.analyzeTime", time2 - time1 ); - stats.put( "ConflictMarker.markTime", time3 - time2 ); - stats.put( "ConflictMarker.nodeCount", nodes.size() ); - } - - return node; - } - - private void analyze( DependencyNode node, Map<DependencyNode, Object> nodes, Map<Object, ConflictGroup> groups, - int[] counter ) - { - if ( nodes.put( node, Boolean.TRUE ) != null ) - { - return; - } - - Set<Object> keys = getKeys( node ); - if ( !keys.isEmpty() ) - { - ConflictGroup group = null; - boolean fixMappings = false; - - for ( Object key : keys ) - { - ConflictGroup g = groups.get( key ); - - if ( group != g ) - { - if ( group == null ) - { - Set<Object> newKeys = merge( g.keys, keys ); - if ( newKeys == g.keys ) - { - group = g; - break; - } - else - { - group = new ConflictGroup( newKeys, counter[0]++ ); - fixMappings = true; - } - } - else if ( g == null ) - { - fixMappings = true; - } - else - { - Set<Object> newKeys = merge( g.keys, group.keys ); - if ( newKeys == g.keys ) - { - group = g; - fixMappings = false; - break; - } - else if ( newKeys != group.keys ) - { - group = new ConflictGroup( newKeys, counter[0]++ ); - fixMappings = true; - } - } - } - } - - if ( group == null ) - { - group = new ConflictGroup( keys, counter[0]++ ); - fixMappings = true; - } - if ( fixMappings ) - { - for ( Object key : group.keys ) - { - groups.put( key, group ); - } - } - } - - for ( DependencyNode child : node.getChildren() ) - { - analyze( child, nodes, groups, counter ); - } - } - - private Set<Object> merge( Set<Object> keys1, Set<Object> keys2 ) - { - int size1 = keys1.size(); - int size2 = keys2.size(); - - if ( size1 < size2 ) - { - if ( keys2.containsAll( keys1 ) ) - { - return keys2; - } - } - else - { - if ( keys1.containsAll( keys2 ) ) - { - return keys1; - } - } - - Set<Object> keys = new HashSet<Object>(); - keys.addAll( keys1 ); - keys.addAll( keys2 ); - return keys; - } - - private Set<Object> getKeys( DependencyNode node ) - { - Set<Object> keys; - - Dependency dependency = node.getDependency(); - - if ( dependency == null ) - { - keys = Collections.emptySet(); - } - else - { - Object key = toKey( dependency.getArtifact() ); - - if ( node.getRelocations().isEmpty() && node.getAliases().isEmpty() ) - { - keys = Collections.singleton( key ); - } - else - { - keys = new HashSet<Object>(); - keys.add( key ); - - for ( Artifact relocation : node.getRelocations() ) - { - key = toKey( relocation ); - keys.add( key ); - } - - for ( Artifact alias : node.getAliases() ) - { - key = toKey( alias ); - keys.add( key ); - } - } - } - - return keys; - } - - private Map<DependencyNode, Object> mark( Collection<DependencyNode> nodes, Map<Object, ConflictGroup> groups ) - { - Map<DependencyNode, Object> conflictIds = new IdentityHashMap<DependencyNode, Object>( nodes.size() + 1 ); - - for ( DependencyNode node : nodes ) - { - Dependency dependency = node.getDependency(); - if ( dependency != null ) - { - Object key = toKey( dependency.getArtifact() ); - conflictIds.put( node, groups.get( key ).index ); - } - } - - return conflictIds; - } - - private static Object toKey( Artifact artifact ) - { - return new Key( artifact ); - } - - static class ConflictGroup - { - - final Set<Object> keys; - - final int index; - - public ConflictGroup( Set<Object> keys, int index ) - { - this.keys = keys; - this.index = index; - } - - @Override - public String toString() - { - return String.valueOf( keys ); - } - - } - - static class Key - { - - private final Artifact artifact; - - public Key( Artifact artifact ) - { - this.artifact = artifact; - } - - @Override - public boolean equals( Object obj ) - { - if ( obj == this ) - { - return true; - } - else if ( !( obj instanceof Key ) ) - { - return false; - } - Key that = (Key) obj; - return artifact.getArtifactId().equals( that.artifact.getArtifactId() ) - && artifact.getGroupId().equals( that.artifact.getGroupId() ) - && artifact.getExtension().equals( that.artifact.getExtension() ) - && artifact.getClassifier().equals( that.artifact.getClassifier() ); - } - - @Override - public int hashCode() - { - int hash = 17; - hash = hash * 31 + artifact.getArtifactId().hashCode(); - hash = hash * 31 + artifact.getGroupId().hashCode(); - hash = hash * 31 + artifact.getClassifier().hashCode(); - hash = hash * 31 + artifact.getExtension().hashCode(); - return hash; - } - - @Override - public String toString() - { - return artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getClassifier() + ':' - + artifact.getExtension(); - } - - } - -}