Compare commits
26 Commits
Author | SHA1 | Date | |
---|---|---|---|
d41d73fa1c | |||
a9aa47d412 | |||
47fd07247d | |||
cfb13f3170 | |||
75f8175a1c | |||
f2c93eec50 | |||
58eb0ec013 | |||
dec181aa71 | |||
51f5d6d0a3 | |||
24d69c3715 | |||
fe10e53fb4 | |||
b6c7323203 | |||
9644bbe154 | |||
9a0b7207c0 | |||
118b40f3f9 | |||
db3061a3a6 | |||
fee4032208 | |||
f991975923 | |||
e4f14a81da | |||
b4426761df | |||
f749926f92 | |||
8c3ce9f069 | |||
3c73bcb83d | |||
cf2fdf42fa | |||
3d7d8bb769 | |||
d22f657f4e |
69
README.md
69
README.md
@@ -5,6 +5,8 @@ This is a maven plugin that allows for developers and organizations to ban Maven
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
Here is an example of the primary reason why this plugin is useful.
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<project>
|
<project>
|
||||||
...
|
...
|
||||||
@@ -18,6 +20,10 @@ This is a maven plugin that allows for developers and organizations to ban Maven
|
|||||||
<version>...</version>
|
<version>...</version>
|
||||||
<extensions>true</extensions>
|
<extensions>true</extensions>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
<import>
|
||||||
|
<url>https://host:port/path/file.xml</url>
|
||||||
|
<artifact>groupId:artifactId:version</artifact>
|
||||||
|
</import>
|
||||||
<includes>
|
<includes>
|
||||||
<artifact>
|
<artifact>
|
||||||
<groupId>...<groupId>
|
<groupId>...<groupId>
|
||||||
@@ -31,7 +37,7 @@ This is a maven plugin that allows for developers and organizations to ban Maven
|
|||||||
</artifact>
|
</artifact>
|
||||||
<artifact>com.inteligr8:ban-maven-plugin:[,1.0.0)</artifact>
|
<artifact>com.inteligr8:ban-maven-plugin:[,1.0.0)</artifact>
|
||||||
<artifact>log4j:log4j</artifact>
|
<artifact>log4j:log4j</artifact>
|
||||||
<artifact>org\.springframework.*::[,4.0.0.RELEASE)</artifact>
|
<artifact>org\.springframe.+::[,4.0.0.RELEASE)</artifact>
|
||||||
</includes>
|
</includes>
|
||||||
<excludes>
|
<excludes>
|
||||||
<artifact>
|
<artifact>
|
||||||
@@ -48,18 +54,67 @@ This is a maven plugin that allows for developers and organizations to ban Maven
|
|||||||
</project>
|
</project>
|
||||||
```
|
```
|
||||||
|
|
||||||
The `extensions` elements is critical. Without it, the plugin does nothing. With it, the plugin is able to detected ban artifacts before they are downloaded.
|
The `extensions` elements is critical. Without it, the plugin does nothing for banning artifacts/dependencies. With it, the plugin is able to not only detect ban artifacts, but do it before they are downloaded. This keeps libraries from even reaching your local Maven repository cache.
|
||||||
|
|
||||||
If no `includes` are provided, then no artifacts will be banned. An *included* artifact is a banned artifact. An *excluded* artifact is not banned. It is the opposite of what you may think.
|
Here is an example of the non-extension use case for the plugin:
|
||||||
|
|
||||||
If `groupId` is not provided, it is ignored in the matching process. So it will match all artifact group IDs and the constraint will be for `artifactId` and `version` only. The same is true for `artifactId` and `version`. This means that `<includes><artifact></artifact></includes>` will ban every artifact.
|
```xml
|
||||||
|
<project>
|
||||||
|
...
|
||||||
|
<build>
|
||||||
|
...
|
||||||
|
<plugins>
|
||||||
|
...
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.inteligr8</groupId>
|
||||||
|
<artifactId>ban-maven-plugin</artifactId>
|
||||||
|
<version>...</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
...
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>clean</id>
|
||||||
|
<phase>clean</phase>
|
||||||
|
<goals><goal>purge-repo</goal></goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
...
|
||||||
|
</plugins>
|
||||||
|
...
|
||||||
|
</build>
|
||||||
|
...
|
||||||
|
</project>
|
||||||
|
```
|
||||||
|
|
||||||
If `groupId` and `groupIdRegex` are both provided, only `groupId` is used. The same is true for `artifactId` and `artifactIdRegex`. The `*Regex` values use standard Java regular expressions. If using regular expressions, remember to escape the dots (`\.`) in group IDs.
|
The `purge-repo` goal will remove all banned artifacts from your local Maven cache. It does not support `groupIdRegex` or blank `groupId` specifications. So any of those will not be purged/removed.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
If no `includes` are provided, then no artifacts will be banned. An *included* artifact is a banned artifact. An *excluded* artifact is not banned. It is the opposite of what you may think. If no `excludes` are provided, then no banned artifacts are granted an exception.
|
||||||
|
|
||||||
|
The `artifact` element supports the descriptive `groupId`/`artifactId`/`version` elements or the abbreviated colon-based notation. When using the colon-based notation, the group ID and artifact ID are treated as `groupIdRegex` and `artifactIdRegex` (see below).
|
||||||
|
|
||||||
|
If `groupId` or `artifactId` or `version` are not provided, they are ignored in the matching process. So it will match all applicable artifacts and the constraint will be only for what was specified. This means that `<includes><artifact>:</artifact></includes>` will ban every artifact and all their versions.
|
||||||
|
|
||||||
|
If `groupId` and `groupIdRegex` are both provided, only `groupId` is used. The same is true for `artifactId` and `artifactIdRegex`. The `*Regex` element values use standard Java regular expression parsing. If using regular expressions, remember to escape the dots (`\.`) in group IDs. If you do use `groupIdRegex` or use regular expressions in the colon-notation, the matching artifacts will not be purged using the `purge-repo` goal. So if you intend to use that goal, group ID regular expression matching needs be avoided.
|
||||||
|
|
||||||
The `version` element supports the standard Maven specification. You can match a specific version like `1.0.0`. Or you can match all versions before `1.2.17` like `[,1.2.17)`. You can match all future versions after `1.2.17` (inclusive) with `[1.2.17,)`.
|
The `version` element supports the standard Maven specification. You can match a specific version like `1.0.0`. Or you can match all versions before `1.2.17` like `[,1.2.17)`. You can match all future versions after `1.2.17` (inclusive) with `[1.2.17,)`.
|
||||||
|
|
||||||
There is nothing stopping you from specifying two `artifact` elements with the exact same values. So you can ban multiple version ranges of the same artifact by using multiple `artifact` elements.
|
There is nothing stopping you from specifying two `artifact` elements with the exact same values. So you can ban multiple version ranges of the same artifact by using multiple `artifact` elements.
|
||||||
|
|
||||||
If you *include* all versions by omitting the `version` element, you can still *exclude* (unban) certain versions, like `[1.2.17,)`.
|
If you *include* all versions by omitting the `version` element, you can still *exclude* (un-ban) certain versions, like `[1.2.17,)`.
|
||||||
|
|
||||||
It is recommended that you look into [Maven Tiles](https://github.com/repaint-io/maven-tiles) so you can use a tile to define your banned artifacts and side load them into all your projects.
|
Order does not matter. All include specifications are processed, followed by all exclude specifications.
|
||||||
|
|
||||||
|
## Import
|
||||||
|
|
||||||
|
The `import` URL and artifact are to reference XML files that conform to the same `configuration` element as described here. In fact, the root elmenet of that XML should be `configuration`. It will only support the `includes` and `excludes` elements. so you cannot do recursive imports.
|
||||||
|
|
||||||
|
You can create a Maven `pom` packaging type project that deploys a configuration XML to your Maven repository. Then use an `import` to allow you to change banned dependencies without making changes to each individual project. Just like with the `version` notation in the `includes` and `excludes` elements, your `import` `artifact` element supports a version range. This way the latest banned dependencies can be side-loaded into all projects. This means previously functioning builds may eventually start failing. That is by design in this scenario.
|
||||||
|
|
||||||
|
The `import` elements supports multiple `url` or `artifact` declarations. All imported and directly specified include specifications are processed before all exclude specifications. You cannot change an include when importing, but you can add new ones, that may cover more versions; and you can exclude versions that may have been included by the import.
|
||||||
|
|
||||||
|
The `excludes` element is a way to provide project-by-project exceptions to imported banned artifacts where warranted.
|
||||||
|
5
pom.xml
5
pom.xml
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<groupId>com.inteligr8</groupId>
|
<groupId>com.inteligr8</groupId>
|
||||||
<artifactId>ban-maven-plugin</artifactId>
|
<artifactId>ban-maven-plugin</artifactId>
|
||||||
<version>1.1.0</version>
|
<version>1.3.1</version>
|
||||||
<packaging>maven-plugin</packaging>
|
<packaging>maven-plugin</packaging>
|
||||||
|
|
||||||
<name>Ban Dependencies Maven Plugin</name>
|
<name>Ban Dependencies Maven Plugin</name>
|
||||||
@@ -106,6 +106,9 @@
|
|||||||
<goals>
|
<goals>
|
||||||
<goal>descriptor</goal>
|
<goal>descriptor</goal>
|
||||||
</goals>
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<goalPrefix>ban</goalPrefix>
|
||||||
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
<execution>
|
<execution>
|
||||||
<id>help-descriptor</id>
|
<id>help-descriptor</id>
|
||||||
|
@@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
||||||
|
import org.apache.maven.artifact.versioning.VersionRange;
|
||||||
|
import org.apache.maven.execution.MavenSession;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
|
import org.eclipse.aether.artifact.Artifact;
|
||||||
|
import org.eclipse.aether.artifact.DefaultArtifact;
|
||||||
|
import org.eclipse.aether.impl.ArtifactResolver;
|
||||||
|
import org.eclipse.aether.impl.VersionRangeResolver;
|
||||||
|
import org.eclipse.aether.resolution.ArtifactRequest;
|
||||||
|
import org.eclipse.aether.resolution.ArtifactResolutionException;
|
||||||
|
import org.eclipse.aether.resolution.ArtifactResult;
|
||||||
|
import org.eclipse.aether.resolution.VersionRangeRequest;
|
||||||
|
import org.eclipse.aether.resolution.VersionRangeResolutionException;
|
||||||
|
import org.eclipse.aether.resolution.VersionRangeResult;
|
||||||
|
import org.eclipse.aether.version.Version;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.inteligr8.maven.model.ArtifactFilter;
|
||||||
|
|
||||||
|
public abstract class AbstractBanConfiguration implements BanConfiguration {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||||
|
private final Pattern artifactPattern = Pattern.compile("^([^:]*):([^:]*)(:([^:]+))?$");
|
||||||
|
private final Pattern notRegexPattern = Pattern.compile("^[A-Za-z0-9_\\.]*$");
|
||||||
|
|
||||||
|
protected final List<ArtifactFilter> includeArtifacts = new LinkedList<>();
|
||||||
|
protected final List<ArtifactFilter> excludeArtifacts = new LinkedList<>();
|
||||||
|
|
||||||
|
private final ArtifactResolver artifactResolver;
|
||||||
|
private final VersionRangeResolver versionRangeResolver;
|
||||||
|
private final MavenSession session;
|
||||||
|
|
||||||
|
public AbstractBanConfiguration(MavenSession session, ArtifactResolver artifactResolver, VersionRangeResolver versionRangeResolver) {
|
||||||
|
this.session = session;
|
||||||
|
this.artifactResolver = artifactResolver;
|
||||||
|
this.versionRangeResolver = versionRangeResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(Xpp3Dom rootDom) throws IOException, MojoFailureException {
|
||||||
|
if (rootDom == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Xpp3Dom importDom = rootDom.getChild("import");
|
||||||
|
if (importDom != null)
|
||||||
|
this.processImports(importDom);
|
||||||
|
this.processIncludesExcludes(rootDom);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processImports(Xpp3Dom importDom) throws IOException, MojoFailureException {
|
||||||
|
for (Xpp3Dom child : importDom.getChildren()) {
|
||||||
|
BanConfigurationDownloader downloader = null;
|
||||||
|
if (child.getName().equals("url")) {
|
||||||
|
String url = StringUtils.trimToNull(child.getValue());
|
||||||
|
downloader = new BanConfigurationDownloader(this.session, this.artifactResolver, this.versionRangeResolver, url);
|
||||||
|
} else if (child.getName().equals("artifact")) {
|
||||||
|
Artifact artifact = new DefaultArtifact(child.getValue());
|
||||||
|
if (!"xml".equals(artifact.getExtension()))
|
||||||
|
artifact = new DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getClassifier(), "xml", artifact.getVersion());
|
||||||
|
|
||||||
|
VersionRangeRequest vrrequest = new VersionRangeRequest(artifact, this.session.getCurrentProject().getRemoteProjectRepositories(), null);
|
||||||
|
try {
|
||||||
|
VersionRangeResult vrresult = this.versionRangeResolver.resolveVersionRange(this.session.getRepositorySession(), vrrequest);
|
||||||
|
if (vrresult.getVersions().isEmpty()) {
|
||||||
|
this.logger.error("The artifact version range could not be resolved; skipping: {}", child.getValue());
|
||||||
|
} else {
|
||||||
|
Version version = vrresult.getHighestVersion();
|
||||||
|
artifact = artifact.setVersion(version.toString());
|
||||||
|
|
||||||
|
ArtifactRequest arequest = new ArtifactRequest(artifact, this.session.getCurrentProject().getRemoteProjectRepositories(), null);
|
||||||
|
try {
|
||||||
|
ArtifactResult aresult = this.artifactResolver.resolveArtifact(this.session.getRepositorySession(), arequest);
|
||||||
|
File file = aresult.getArtifact().getFile();
|
||||||
|
downloader = new BanConfigurationDownloader(this.session, this.artifactResolver, this.versionRangeResolver, file);
|
||||||
|
} catch (ArtifactResolutionException are) {
|
||||||
|
this.logger.warn("The artifact version could not be resolved; skipping: {}", artifact, version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (VersionRangeResolutionException vrre) {
|
||||||
|
this.logger.error("The artifact version range could not be resolved; skipping: {}", child.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (downloader != null) {
|
||||||
|
this.includeArtifacts.addAll(downloader.getIncludeArtifacts());
|
||||||
|
this.excludeArtifacts.addAll(downloader.getExcludeArtifacts());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processIncludesExcludes(Xpp3Dom rootDom) {
|
||||||
|
Xpp3Dom includesDom = rootDom.getChild("includes");
|
||||||
|
if (includesDom != null)
|
||||||
|
this.includeArtifacts.addAll(this.parseArtifacts(includesDom));
|
||||||
|
|
||||||
|
Xpp3Dom excludesDom = rootDom.getChild("excludes");
|
||||||
|
if (excludesDom != null)
|
||||||
|
this.excludeArtifacts.addAll(this.parseArtifacts(excludesDom));
|
||||||
|
|
||||||
|
this.logger.debug("Include artifacts: {}", this.includeArtifacts);
|
||||||
|
this.logger.debug("Exclude artifacts: {}", this.excludeArtifacts);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ArtifactFilter> getIncludeArtifacts() {
|
||||||
|
return this.includeArtifacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ArtifactFilter> getExcludeArtifacts() {
|
||||||
|
return this.excludeArtifacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ArtifactFilter> parseArtifacts(Xpp3Dom artifactsDom) {
|
||||||
|
List<ArtifactFilter> filters = new LinkedList<>();
|
||||||
|
|
||||||
|
for (Xpp3Dom artifactDom : artifactsDom.getChildren("artifact")) {
|
||||||
|
ArtifactFilter filter = new ArtifactFilter();
|
||||||
|
String versionSpec = null;
|
||||||
|
if (artifactDom.getChildCount() == 0) {
|
||||||
|
Matcher matcher = this.artifactPattern.matcher(artifactDom.getValue());
|
||||||
|
if (!matcher.matches()) {
|
||||||
|
this.logger.warn("The artifact format '{}' does not match the expected regular expression: {}; ignoring ...", artifactDom.getValue(), this.artifactPattern.pattern());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.notRegexPattern.matcher(matcher.group(1)).matches()) {
|
||||||
|
filter.setGroupId(StringUtils.trimToNull(matcher.group(1)));
|
||||||
|
} else {
|
||||||
|
filter.setGroupIdRegex(StringUtils.trimToNull(matcher.group(1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.notRegexPattern.matcher(matcher.group(2)).matches()) {
|
||||||
|
filter.setArtifactId(StringUtils.trimToNull(matcher.group(2)));
|
||||||
|
} else {
|
||||||
|
filter.setArtifactIdRegex(StringUtils.trimToNull(matcher.group(2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
versionSpec = StringUtils.trimToNull(matcher.group(4));
|
||||||
|
} else {
|
||||||
|
filter.setGroupId(this.getChildValue(artifactDom, "groupId"));
|
||||||
|
filter.setGroupIdRegex(this.getChildValue(artifactDom, "groupIdRegex"));
|
||||||
|
filter.setArtifactId(this.getChildValue(artifactDom, "artifactId"));
|
||||||
|
filter.setArtifactIdRegex(this.getChildValue(artifactDom, "artifactIdRegex"));
|
||||||
|
|
||||||
|
versionSpec = this.getChildValue(artifactDom, "version");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (versionSpec != null) {
|
||||||
|
try {
|
||||||
|
VersionRange versionRange = VersionRange.createFromVersionSpec(versionSpec);
|
||||||
|
filter.setVersionRange(versionRange);
|
||||||
|
} catch (InvalidVersionSpecificationException ivse) {
|
||||||
|
this.logger.warn("The artifact '{}' has an invalid version specification; the artifact element will be ignored: {}", ivse.getMessage());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filters.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
return filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getChildValue(Xpp3Dom dom, String child) {
|
||||||
|
Xpp3Dom childDom = dom.getChild(child);
|
||||||
|
return childDom == null ? null : StringUtils.trimToNull(childDom.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
27
src/main/java/com/inteligr8/maven/ban/BanConfiguration.java
Normal file
27
src/main/java/com/inteligr8/maven/ban/BanConfiguration.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.inteligr8.maven.model.ArtifactFilter;
|
||||||
|
|
||||||
|
public interface BanConfiguration {
|
||||||
|
|
||||||
|
List<ArtifactFilter> getIncludeArtifacts();
|
||||||
|
|
||||||
|
List<ArtifactFilter> getExcludeArtifacts();
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import org.apache.maven.execution.MavenSession;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
|
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
|
||||||
|
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||||
|
import org.eclipse.aether.impl.ArtifactResolver;
|
||||||
|
import org.eclipse.aether.impl.VersionRangeResolver;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class BanConfigurationDownloader extends AbstractBanConfiguration {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
|
public BanConfigurationDownloader(MavenSession session, ArtifactResolver artifactResolver, VersionRangeResolver versionRangeResolver, String url) throws IOException, MojoFailureException {
|
||||||
|
super(session, artifactResolver, versionRangeResolver);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Xpp3Dom rootDom = this.load(new URL(url));
|
||||||
|
this.init(rootDom);
|
||||||
|
} catch (XmlPullParserException xppe) {
|
||||||
|
throw new MojoFailureException(xppe.getMessage(), xppe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BanConfigurationDownloader(MavenSession session, ArtifactResolver artifactResolver, VersionRangeResolver versionRangeResolver, File file) throws IOException, MojoFailureException {
|
||||||
|
super(session, artifactResolver, versionRangeResolver);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Xpp3Dom rootDom = this.load(file);
|
||||||
|
this.init(rootDom);
|
||||||
|
} catch (XmlPullParserException xppe) {
|
||||||
|
throw new MojoFailureException(xppe.getMessage(), xppe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Xpp3Dom load(URL url) throws IOException, XmlPullParserException {
|
||||||
|
InputStream istream = url.openStream();
|
||||||
|
BufferedInputStream bistream = new BufferedInputStream(istream, 16384);
|
||||||
|
try {
|
||||||
|
this.logger.debug("Downloading configuration: {}", url);
|
||||||
|
return Xpp3DomBuilder.build(bistream, "utf-8");
|
||||||
|
} finally {
|
||||||
|
bistream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Xpp3Dom load(File file) throws IOException, XmlPullParserException {
|
||||||
|
FileInputStream fistream = new FileInputStream(file);
|
||||||
|
BufferedInputStream bistream = new BufferedInputStream(fistream, 16384);
|
||||||
|
try {
|
||||||
|
this.logger.debug("Downloading configuration: {}", file);
|
||||||
|
return Xpp3DomBuilder.build(bistream, "utf-8");
|
||||||
|
} finally {
|
||||||
|
bistream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -14,118 +14,22 @@
|
|||||||
*/
|
*/
|
||||||
package com.inteligr8.maven.ban;
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.maven.execution.MavenSession;
|
||||||
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
|
||||||
import org.apache.maven.artifact.versioning.VersionRange;
|
|
||||||
import org.apache.maven.model.Plugin;
|
import org.apache.maven.model.Plugin;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
import org.slf4j.Logger;
|
import org.eclipse.aether.impl.ArtifactResolver;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.eclipse.aether.impl.VersionRangeResolver;
|
||||||
|
|
||||||
import com.inteligr8.maven.model.ArtifactFilter;
|
public class BanConfigurationParser extends AbstractBanConfiguration {
|
||||||
|
|
||||||
public class BanConfigurationParser {
|
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
public BanConfigurationParser(MavenSession session, ArtifactResolver artifactResolver, VersionRangeResolver versionRangeResolver, Plugin plugin) throws IOException, MojoFailureException {
|
||||||
private final Pattern artifactPattern = Pattern.compile("^([^:]+):([^:]+)(:([^:]+))?$");
|
super(session, artifactResolver, versionRangeResolver);
|
||||||
private final Pattern notRegexPattern = Pattern.compile("^[A-Za-z0-9_\\.]*$");
|
|
||||||
|
|
||||||
private final List<ArtifactFilter> includeArtifacts;
|
|
||||||
private final List<ArtifactFilter> excludeArtifacts;
|
|
||||||
|
|
||||||
public BanConfigurationParser(Plugin plugin) {
|
|
||||||
Xpp3Dom rootDom = (Xpp3Dom) plugin.getConfiguration();
|
Xpp3Dom rootDom = (Xpp3Dom) plugin.getConfiguration();
|
||||||
if (rootDom == null) {
|
this.init(rootDom);
|
||||||
this.includeArtifacts = Collections.emptyList();
|
|
||||||
this.excludeArtifacts = Collections.emptyList();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Xpp3Dom includesDom = rootDom.getChild("includes");
|
|
||||||
if (includesDom != null) {
|
|
||||||
this.includeArtifacts = this.parseArtifacts(includesDom);
|
|
||||||
this.logger.debug("Include artifacts: {}", this.includeArtifacts);
|
|
||||||
} else {
|
|
||||||
this.includeArtifacts = Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
Xpp3Dom excludesDom = rootDom.getChild("excludes");
|
|
||||||
if (excludesDom != null) {
|
|
||||||
this.excludeArtifacts = this.parseArtifacts(excludesDom);
|
|
||||||
this.logger.debug("Exclude artifacts: {}", this.excludeArtifacts);
|
|
||||||
} else {
|
|
||||||
this.excludeArtifacts = Collections.emptyList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ArtifactFilter> getIncludeArtifacts() {
|
|
||||||
return this.includeArtifacts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ArtifactFilter> getExcludeArtifacts() {
|
|
||||||
return this.excludeArtifacts;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<ArtifactFilter> parseArtifacts(Xpp3Dom artifactsDom) {
|
|
||||||
List<ArtifactFilter> filters = new LinkedList<>();
|
|
||||||
|
|
||||||
for (Xpp3Dom artifactDom : artifactsDom.getChildren("artifact")) {
|
|
||||||
ArtifactFilter filter = new ArtifactFilter();
|
|
||||||
String versionSpec = null;
|
|
||||||
if (artifactDom.getChildCount() == 0) {
|
|
||||||
Matcher matcher = this.artifactPattern.matcher(artifactDom.getValue());
|
|
||||||
if (!matcher.matches()) {
|
|
||||||
this.logger.warn("The artifact format '{}' does not match the expected regular expression: {}; ignoring ...", artifactDom.getValue(), this.artifactPattern.pattern());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.notRegexPattern.matcher(matcher.group(1)).matches()) {
|
|
||||||
filter.setGroupId(StringUtils.trimToNull(matcher.group(1)));
|
|
||||||
} else {
|
|
||||||
filter.setGroupIdRegex(StringUtils.trimToNull(matcher.group(1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.notRegexPattern.matcher(matcher.group(2)).matches()) {
|
|
||||||
filter.setArtifactId(StringUtils.trimToNull(matcher.group(2)));
|
|
||||||
} else {
|
|
||||||
filter.setArtifactIdRegex(StringUtils.trimToNull(matcher.group(2)));
|
|
||||||
}
|
|
||||||
|
|
||||||
versionSpec = StringUtils.trimToNull(matcher.group(4));
|
|
||||||
} else {
|
|
||||||
filter.setGroupId(this.getChildValue(artifactDom, "groupId"));
|
|
||||||
filter.setGroupIdRegex(this.getChildValue(artifactDom, "groupIdRegex"));
|
|
||||||
filter.setArtifactId(this.getChildValue(artifactDom, "artifactId"));
|
|
||||||
filter.setArtifactIdRegex(this.getChildValue(artifactDom, "artifactIdRegex"));
|
|
||||||
|
|
||||||
versionSpec = this.getChildValue(artifactDom, "version");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (versionSpec != null) {
|
|
||||||
try {
|
|
||||||
VersionRange versionRange = VersionRange.createFromVersionSpec(versionSpec);
|
|
||||||
filter.setVersionRange(versionRange);
|
|
||||||
} catch (InvalidVersionSpecificationException ivse) {
|
|
||||||
this.logger.warn("The artifact '{}' has an invalid version specification; the artifact element will be ignored: {}", ivse.getMessage());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
filters.add(filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
return filters;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getChildValue(Xpp3Dom dom, String child) {
|
|
||||||
Xpp3Dom childDom = dom.getChild(child);
|
|
||||||
return childDom == null ? null : StringUtils.trimToNull(childDom.getValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.inteligr8.maven.ban;
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -25,6 +26,7 @@ import org.apache.maven.AbstractMavenLifecycleParticipant;
|
|||||||
import org.apache.maven.MavenExecutionException;
|
import org.apache.maven.MavenExecutionException;
|
||||||
import org.apache.maven.execution.MavenSession;
|
import org.apache.maven.execution.MavenSession;
|
||||||
import org.apache.maven.model.Plugin;
|
import org.apache.maven.model.Plugin;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
import org.apache.maven.plugin.PluginResolutionException;
|
import org.apache.maven.plugin.PluginResolutionException;
|
||||||
import org.apache.maven.plugin.internal.PluginDependenciesResolver;
|
import org.apache.maven.plugin.internal.PluginDependenciesResolver;
|
||||||
import org.apache.maven.project.DefaultDependencyResolutionRequest;
|
import org.apache.maven.project.DefaultDependencyResolutionRequest;
|
||||||
@@ -37,6 +39,8 @@ import org.eclipse.aether.artifact.DefaultArtifact;
|
|||||||
import org.eclipse.aether.graph.Dependency;
|
import org.eclipse.aether.graph.Dependency;
|
||||||
import org.eclipse.aether.graph.DependencyFilter;
|
import org.eclipse.aether.graph.DependencyFilter;
|
||||||
import org.eclipse.aether.graph.DependencyNode;
|
import org.eclipse.aether.graph.DependencyNode;
|
||||||
|
import org.eclipse.aether.impl.ArtifactResolver;
|
||||||
|
import org.eclipse.aether.impl.VersionRangeResolver;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -50,6 +54,12 @@ public class BanExtension extends AbstractMavenLifecycleParticipant {
|
|||||||
|
|
||||||
private Logger logger = LoggerFactory.getLogger(this.getClass());
|
private Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ArtifactResolver artifactResolver;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private VersionRangeResolver versionRangeResolver;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ProjectDependenciesResolver projDepResolver;
|
private ProjectDependenciesResolver projDepResolver;
|
||||||
|
|
||||||
@@ -58,13 +68,14 @@ public class BanExtension extends AbstractMavenLifecycleParticipant {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterProjectsRead(MavenSession session) throws MavenExecutionException {
|
public void afterProjectsRead(MavenSession session) throws MavenExecutionException {
|
||||||
MavenProject project = session.getCurrentProject();
|
BanConfiguration config = this.getConfiguration(session);
|
||||||
BanConfigurationParser config = this.getConfiguration(project);
|
|
||||||
if (config == null)
|
if (config == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BanDependencyFilter depFilter = new BanDependencyFilter(config.getIncludeArtifacts(), config.getExcludeArtifacts());
|
BanDependencyFilter depFilter = new BanDependencyFilter(config.getIncludeArtifacts(), config.getExcludeArtifacts());
|
||||||
depFilter.setFailFast(true);
|
depFilter.setFailFast(true);
|
||||||
|
|
||||||
|
MavenProject project = session.getCurrentProject();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (Plugin plugin : project.getBuildPlugins()) {
|
for (Plugin plugin : project.getBuildPlugins()) {
|
||||||
@@ -95,7 +106,8 @@ public class BanExtension extends AbstractMavenLifecycleParticipant {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private BanConfigurationParser getConfiguration(MavenProject project) throws MavenExecutionException {
|
private BanConfiguration getConfiguration(MavenSession session) throws MavenExecutionException {
|
||||||
|
MavenProject project = session.getCurrentProject();
|
||||||
Plugin plugin = project.getPlugin(THIS_PLUGIN_KEY);
|
Plugin plugin = project.getPlugin(THIS_PLUGIN_KEY);
|
||||||
if (plugin == null)
|
if (plugin == null)
|
||||||
throw new MavenExecutionException("The plugin is executing but it cannot be found", project.getFile());
|
throw new MavenExecutionException("The plugin is executing but it cannot be found", project.getFile());
|
||||||
@@ -104,7 +116,11 @@ public class BanExtension extends AbstractMavenLifecycleParticipant {
|
|||||||
this.logger.warn("The '{}' plugin must be defined with '<extensions>true</extensions>'; ignoring plugin", plugin.getId());
|
this.logger.warn("The '{}' plugin must be defined with '<extensions>true</extensions>'; ignoring plugin", plugin.getId());
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
return new BanConfigurationParser(plugin);
|
try {
|
||||||
|
return new BanConfigurationParser(session, this.artifactResolver, this.versionRangeResolver, plugin);
|
||||||
|
} catch (IOException | MojoFailureException e) {
|
||||||
|
throw new MavenExecutionException(e.getMessage(), project.getFile());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@ import java.nio.file.Path;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.nio.file.attribute.BasicFileAttributes;
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -44,6 +45,8 @@ import org.apache.maven.plugins.annotations.Mojo;
|
|||||||
import org.apache.maven.plugins.annotations.Parameter;
|
import org.apache.maven.plugins.annotations.Parameter;
|
||||||
import org.apache.maven.project.MavenProject;
|
import org.apache.maven.project.MavenProject;
|
||||||
import org.codehaus.plexus.component.annotations.Component;
|
import org.codehaus.plexus.component.annotations.Component;
|
||||||
|
import org.eclipse.aether.impl.ArtifactResolver;
|
||||||
|
import org.eclipse.aether.impl.VersionRangeResolver;
|
||||||
|
|
||||||
import com.inteligr8.maven.model.ArtifactFilter;
|
import com.inteligr8.maven.model.ArtifactFilter;
|
||||||
|
|
||||||
@@ -54,6 +57,12 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
@Inject
|
@Inject
|
||||||
private MavenSession session;
|
private MavenSession session;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ArtifactResolver artifactResolver;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private VersionRangeResolver versionRangeResolver;
|
||||||
|
|
||||||
@Parameter(name = "skip", defaultValue = "false")
|
@Parameter(name = "skip", defaultValue = "false")
|
||||||
private boolean skip = false;
|
private boolean skip = false;
|
||||||
|
|
||||||
@@ -78,7 +87,7 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
private void purge() throws MojoFailureException, IOException {
|
private void purge() throws MojoFailureException, IOException {
|
||||||
List<Path> includePaths = new LinkedList<>();
|
List<Path> includePaths = new LinkedList<>();
|
||||||
|
|
||||||
BanConfigurationParser config = this.getConfiguration(this.session.getCurrentProject());
|
BanConfigurationParser config = this.getConfiguration();
|
||||||
|
|
||||||
for (ArtifactFilter afilter : config.getIncludeArtifacts()) {
|
for (ArtifactFilter afilter : config.getIncludeArtifacts()) {
|
||||||
if (afilter.getGroupId() == null) {
|
if (afilter.getGroupId() == null) {
|
||||||
@@ -86,10 +95,13 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Path groupPath = this.getGroupPath(afilter);
|
Path groupPath = this.resolveGroupPath(afilter);
|
||||||
List<Path> artifactPaths = this.getArtifactPaths(groupPath, afilter);
|
if (groupPath == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
List<Path> artifactPaths = this.resolveArtifactPaths(groupPath, afilter);
|
||||||
for (Path artifactPath : artifactPaths)
|
for (Path artifactPath : artifactPaths)
|
||||||
includePaths.addAll(this.getVersionPaths(artifactPath, afilter.getVersionRange()));
|
includePaths.addAll(this.resolveVersionPaths(artifactPath, afilter.getVersionRange()));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getLog().debug("May be purging all files in " + includePaths.size() + " paths");
|
this.getLog().debug("May be purging all files in " + includePaths.size() + " paths");
|
||||||
@@ -101,7 +113,7 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
StringBuilder regex = new StringBuilder();
|
StringBuilder regex = new StringBuilder();
|
||||||
|
|
||||||
if (afilter.getGroupId() != null) {
|
if (afilter.getGroupId() != null) {
|
||||||
regex.append('^').append(this.getGroupPath(afilter));
|
regex.append('^').append(this.resolveGroupPath(afilter));
|
||||||
} else if (afilter.getGroupIdRegex() != null) {
|
} else if (afilter.getGroupIdRegex() != null) {
|
||||||
regex.append(afilter.getGroupIdRegex().replace("\\.", regexDirectorySeparator));
|
regex.append(afilter.getGroupIdRegex().replace("\\.", regexDirectorySeparator));
|
||||||
if (regex.charAt(0) != '^')
|
if (regex.charAt(0) != '^')
|
||||||
@@ -159,27 +171,47 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private BanConfigurationParser getConfiguration(MavenProject project) throws MojoFailureException {
|
private BanConfigurationParser getConfiguration() throws MojoFailureException, IOException {
|
||||||
|
MavenProject project = this.session.getCurrentProject();
|
||||||
Plugin plugin = project.getPlugin(BanExtension.THIS_PLUGIN_KEY);
|
Plugin plugin = project.getPlugin(BanExtension.THIS_PLUGIN_KEY);
|
||||||
if (plugin == null)
|
if (plugin == null)
|
||||||
throw new MojoFailureException("The plugin is executing but it cannot be found");
|
throw new MojoFailureException("The plugin is executing but it cannot be found");
|
||||||
return new BanConfigurationParser(plugin);
|
return new BanConfigurationParser(this.session, this.artifactResolver, this.versionRangeResolver, plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Path getGroupPath(ArtifactFilter afilter) {
|
private Path resolveGroupPath(ArtifactFilter afilter) {
|
||||||
|
if (afilter.getGroupId() == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
String[] pathElements = afilter.getGroupId().split("\\.");
|
String[] pathElements = afilter.getGroupId().split("\\.");
|
||||||
Path groupPath = Paths.get("");
|
Path groupPath = Paths.get("");
|
||||||
for (String pathElement : pathElements)
|
for (String pathElement : pathElements)
|
||||||
groupPath = groupPath.resolve(pathElement);
|
groupPath = groupPath.resolve(pathElement);
|
||||||
|
|
||||||
|
Path fullGroupPath = this.getRepositoryPath().resolve(groupPath);
|
||||||
|
if (!Files.exists(fullGroupPath)) {
|
||||||
|
this.getLog().debug("The group path does not exist, so nothing to purge: " + fullGroupPath);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return groupPath;
|
return groupPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Path> getArtifactPaths(Path groupPath, ArtifactFilter afilter) throws IOException {
|
private List<Path> resolveArtifactPaths(Path groupPath, ArtifactFilter afilter) throws IOException {
|
||||||
if (afilter.getArtifactId() != null)
|
Path repoPath = this.getRepositoryPath();
|
||||||
return Arrays.asList(groupPath.resolve(afilter.getArtifactId()));
|
|
||||||
|
if (afilter.getArtifactId() != null) {
|
||||||
|
Path artifactPath = groupPath.resolve(afilter.getArtifactId());
|
||||||
|
Path fullArtifactPath = repoPath.resolve(artifactPath);
|
||||||
|
if (Files.exists(fullArtifactPath)) {
|
||||||
|
return Arrays.asList(artifactPath);
|
||||||
|
} else {
|
||||||
|
this.getLog().debug("The artifact path does not exist, so nothing to purge: " + fullArtifactPath);
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Pattern artifactPattern = afilter.getArtifactIdRegex() == null ? null : Pattern.compile(afilter.getArtifactIdRegex());
|
Pattern artifactPattern = afilter.getArtifactIdRegex() == null ? null : Pattern.compile(afilter.getArtifactIdRegex());
|
||||||
Path repoPath = this.getRepositoryPath();
|
|
||||||
List<Path> paths = new LinkedList<>();
|
List<Path> paths = new LinkedList<>();
|
||||||
|
|
||||||
if (artifactPattern == null)
|
if (artifactPattern == null)
|
||||||
@@ -203,7 +235,7 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Path> getVersionPaths(Path artifactPath, VersionRange versionRange) throws IOException {
|
private List<Path> resolveVersionPaths(Path artifactPath, VersionRange versionRange) throws IOException {
|
||||||
Path repoPath = this.getRepositoryPath();
|
Path repoPath = this.getRepositoryPath();
|
||||||
List<Path> paths = new LinkedList<>();
|
List<Path> paths = new LinkedList<>();
|
||||||
|
|
||||||
@@ -243,7 +275,14 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||||
Files.delete(file);
|
try {
|
||||||
|
if (!attrs.isDirectory())
|
||||||
|
Files.delete(file);
|
||||||
|
} catch (IOException ie) {
|
||||||
|
getLog().debug(ie);
|
||||||
|
getLog().warn("The file failed to delete: " + file);
|
||||||
|
}
|
||||||
|
|
||||||
return FileVisitResult.CONTINUE;
|
return FileVisitResult.CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,7 +293,13 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
|
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
|
||||||
Files.delete(dir);
|
try {
|
||||||
|
Files.delete(dir);
|
||||||
|
} catch (IOException ie) {
|
||||||
|
getLog().debug(ie);
|
||||||
|
getLog().warn("The folder failed to delete: " + dir);
|
||||||
|
}
|
||||||
|
|
||||||
return FileVisitResult.CONTINUE;
|
return FileVisitResult.CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user