diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java index e091978ad..fe1bb16eb 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java @@ -29,7 +29,7 @@ * A version filter that combines multiple version filters into a chain where each filter gets invoked one after the * other, thereby accumulating their filtering effects. */ -public final class ChainedVersionFilter implements VersionFilter { +public class ChainedVersionFilter implements VersionFilter { private final VersionFilter[] filters; diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ContextualAncestorSnapshotVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ContextualAncestorSnapshotVersionFilter.java new file mode 100644 index 000000000..0400f8edb --- /dev/null +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ContextualAncestorSnapshotVersionFilter.java @@ -0,0 +1,66 @@ +/* + * 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. + */ +package org.eclipse.aether.util.graph.version; + +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.collection.DependencyCollectionContext; +import org.eclipse.aether.collection.VersionFilter; + +/** + * A version filter that blocks "*-SNAPSHOT" versions if the + * {@link VersionFilterContext#getDependency()} ancestor whose range is being filtered is not a snapshot. + */ +public class ContextualAncestorSnapshotVersionFilter implements VersionFilter { + private final SnapshotVersionFilter filter; + + /** + * Creates a new instance of this version filter. + */ + public ContextualAncestorSnapshotVersionFilter() { + filter = new SnapshotVersionFilter(); + } + + @Override + public void filterVersions(VersionFilterContext context) { + Artifact ancestor = context.getDependency().getArtifact(); + if (!ancestor.isSnapshot()) { + filter.filterVersions(context); + } + } + + @Override + public VersionFilter deriveChildFilter(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; + } + return true; + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } +} diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ContextualSnapshotVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ContextualSnapshotVersionFilter.java index 24f1f2685..968e737de 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ContextualSnapshotVersionFilter.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ContextualSnapshotVersionFilter.java @@ -28,11 +28,9 @@ /** * A version filter that blocks "*-SNAPSHOT" versions if the * {@link org.eclipse.aether.collection.CollectRequest#getRootArtifact() root artifact} of the dependency graph is not a - * snapshot. Alternatively, this filter can be forced to always ban snapshot versions by setting the boolean - * {@link RepositorySystemSession#getConfigProperties() configuration property} {@link #CONFIG_PROP_ENABLE} to - * {@code true}. + * snapshot. */ -public final class ContextualSnapshotVersionFilter implements VersionFilter { +public class ContextualSnapshotVersionFilter implements VersionFilter { /** * The key in the repository session's {@link RepositorySystemSession#getConfigProperties() configuration * properties} used to store a {@link Boolean} flag whether this filter should be forced to ban snapshots. By @@ -41,7 +39,9 @@ public final class ContextualSnapshotVersionFilter implements VersionFilter { * @configurationSource {@link RepositorySystemSession#getConfigProperties()} * @configurationType {@link java.lang.Boolean} * @configurationDefaultValue false + * @deprecated Use snapshot filter instead to always ban snapshots. */ + @Deprecated public static final String CONFIG_PROP_ENABLE = ConfigurationProperties.PREFIX_AETHER + "snapshotFilter"; private final SnapshotVersionFilter filter; diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java index 7c6c7b258..b5b3db112 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java @@ -27,7 +27,7 @@ /** * A version filter that excludes any version except the highest one. */ -public final class HighestVersionFilter implements VersionFilter { +public class HighestVersionFilter implements VersionFilter { private final int count; /** diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java index afc444b6b..25b81976e 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java @@ -29,7 +29,7 @@ * * @since 2.0.0 */ -public final class LowestVersionFilter implements VersionFilter { +public class LowestVersionFilter implements VersionFilter { private final int count; /** diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/PredicateVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/PredicateVersionFilter.java index 716e91bfa..2f66d6c7c 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/PredicateVersionFilter.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/PredicateVersionFilter.java @@ -34,7 +34,7 @@ * * @since 2.0.0 */ -public final class PredicateVersionFilter implements VersionFilter { +public class PredicateVersionFilter implements VersionFilter { private final Predicate artifactPredicate; /** diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ReleaseVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ReleaseVersionFilter.java new file mode 100644 index 000000000..08a250122 --- /dev/null +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ReleaseVersionFilter.java @@ -0,0 +1,32 @@ +/* + * 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. + */ +package org.eclipse.aether.util.graph.version; + +/** + * A version filter that (unconditionally) blocks non "*-SNAPSHOT" versions. + */ +public class ReleaseVersionFilter extends VersionPredicateVersionFilter { + + /** + * Creates a new instance of this version filter. + */ + public ReleaseVersionFilter() { + super(v -> v.toString().endsWith("SNAPSHOT")); + } +} diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/SnapshotVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/SnapshotVersionFilter.java index fad4a29dc..f933551b0 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/SnapshotVersionFilter.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/SnapshotVersionFilter.java @@ -18,50 +18,16 @@ */ package org.eclipse.aether.util.graph.version; -import java.util.Iterator; - -import org.eclipse.aether.collection.DependencyCollectionContext; -import org.eclipse.aether.collection.VersionFilter; -import org.eclipse.aether.version.Version; - /** * A version filter that (unconditionally) blocks "*-SNAPSHOT" versions. For practical purposes, * {@link ContextualSnapshotVersionFilter} is usually more desirable. */ -public final class SnapshotVersionFilter implements VersionFilter { +public class SnapshotVersionFilter extends VersionPredicateVersionFilter { /** * Creates a new instance of this version filter. */ - public SnapshotVersionFilter() {} - - @Override - public void filterVersions(VersionFilterContext context) { - for (Iterator it = context.iterator(); it.hasNext(); ) { - String version = it.next().toString(); - if (version.endsWith("SNAPSHOT")) { - it.remove(); - } - } - } - - @Override - public VersionFilter deriveChildFilter(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; - } - return true; - } - - @Override - public int hashCode() { - return getClass().hashCode(); + public SnapshotVersionFilter() { + super(v -> !v.toString().endsWith("SNAPSHOT")); } } diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/VersionPredicateVersionFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/VersionPredicateVersionFilter.java new file mode 100644 index 000000000..65a4d9fc9 --- /dev/null +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/VersionPredicateVersionFilter.java @@ -0,0 +1,77 @@ +/* + * 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. + */ +package org.eclipse.aether.util.graph.version; + +import java.util.Iterator; +import java.util.Objects; +import java.util.function.Predicate; + +import org.eclipse.aether.collection.DependencyCollectionContext; +import org.eclipse.aether.collection.VersionFilter; +import org.eclipse.aether.version.Version; + +import static java.util.Objects.requireNonNull; + +/** + * A version filter that excludes any version that is blacklisted. + * + * @since 2.0.11 + */ +public class VersionPredicateVersionFilter implements VersionFilter { + private final Predicate versionPredicate; + + /** + * Creates a new instance of this version filter. It will filter out versions not matched by predicate. + * Note: filter always operates with baseVersions. + */ + public VersionPredicateVersionFilter(Predicate versionPredicate) { + this.versionPredicate = requireNonNull(versionPredicate); + } + + @Override + public void filterVersions(VersionFilterContext context) { + for (Iterator it = context.iterator(); it.hasNext(); ) { + if (!versionPredicate.test(it.next())) { + it.remove(); + } + } + } + + @Override + public VersionFilter deriveChildFilter(DependencyCollectionContext context) { + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + VersionPredicateVersionFilter that = (VersionPredicateVersionFilter) o; + return Objects.equals(versionPredicate, that.versionPredicate); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } +} diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/ReleaseVersionFilterTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/ReleaseVersionFilterTest.java new file mode 100644 index 000000000..bf27548eb --- /dev/null +++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/ReleaseVersionFilterTest.java @@ -0,0 +1,53 @@ +/* + * 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. + */ +package org.eclipse.aether.util.graph.versions; + +import org.eclipse.aether.collection.VersionFilter.VersionFilterContext; +import org.eclipse.aether.util.graph.version.ReleaseVersionFilter; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertSame; + +public class ReleaseVersionFilterTest extends AbstractVersionFilterTest { + + @Test + void testFilterVersions() { + ReleaseVersionFilter filter = new ReleaseVersionFilter(); + VersionFilterContext ctx = newContext("g:a:[1,9]", "1", "2-SNAPSHOT", "3.1", "4.0-SNAPSHOT", "5.0.0"); + filter.filterVersions(ctx); + assertVersions(ctx, "2-SNAPSHOT", "4.0-SNAPSHOT"); + } + + @Test + void testDeriveChildFilter() { + ReleaseVersionFilter filter = new ReleaseVersionFilter(); + assertSame(filter, derive(filter, "g:a:1")); + } + + @SuppressWarnings("EqualsWithItself") + @Test + void testEquals() { + ReleaseVersionFilter filter = new ReleaseVersionFilter(); + assertNotEquals(null, filter); + assertEquals(filter, filter); + assertEquals(filter, new ReleaseVersionFilter()); + } +}