Commit 3d7d8bb7 authored by Brian Long's avatar Brian Long
Browse files

Merge branch 'develop' into stable

parents 01768754 d22f657f
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -31,13 +31,14 @@ This is a maven plugin that allows for developers and organizations to ban Maven
                        </artifact>
                        <artifact>com.inteligr8:ban-maven-plugin:[,1.0.0)</artifact>
                        <artifact>log4j:log4j</artifact>
                        <artifact>org\.springframework.*::[,4.0.0.RELEASE)</artifact>
                        <artifact>org\.springframe.+::[,4.0.0.RELEASE)</artifact>
                    </includes>
                    <excludes>
                    	   <artifact>
                    	       ....
                    	   </artifact>
                    </excludes>
                    <import>https://domain:port/path/file</import>
                </configuration>
            </plugin>
            ...
@@ -61,5 +62,3 @@ The `version` element supports the standard Maven specification. You can match
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,)`.

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.
 No newline at end of file
+130 −0
Original line number Diff line number Diff line
/*
 * 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.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.plugin.MojoFailureException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.inteligr8.maven.model.ArtifactFilter;

public 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_\\.]*$");
    
    private final List<ArtifactFilter> includeArtifacts = new LinkedList<>();
    private final List<ArtifactFilter> excludeArtifacts = new LinkedList<>();
    
    public void init(Xpp3Dom rootDom) throws IOException, MojoFailureException {
        if (rootDom == null)
            return;
        
        Xpp3Dom importDom = rootDom.getChild("import");
        if (importDom != null) {
            String url = StringUtils.trimToNull(importDom.getValue());
            BanConfigurationDownloader downloader = new BanConfigurationDownloader(url);
            this.includeArtifacts.addAll(downloader.getIncludeArtifacts());
            this.excludeArtifacts.addAll(downloader.getExcludeArtifacts());
        }
        
        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 −0
Original line number Diff line number Diff line
/*
 * 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(); 
    
}
+54 −0
Original line number Diff line number Diff line
/*
 * 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.IOException;
import java.io.InputStream;
import java.net.URL;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BanConfigurationDownloader extends AbstractBanConfiguration {
    
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    public BanConfigurationDownloader(String url) throws IOException, MojoFailureException {
        try {
            Xpp3Dom rootDom = this.load(new URL(url));
            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();
        }
        
    }
    
}
+5 −106
Original line number Diff line number Diff line
@@ -14,118 +14,17 @@
 */
package com.inteligr8.maven.ban;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.IOException;

import org.apache.commons.lang3.StringUtils;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.MojoFailureException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.inteligr8.maven.model.ArtifactFilter;
public class BanConfigurationParser extends AbstractBanConfiguration {
    
public class BanConfigurationParser {
    
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final Pattern artifactPattern = Pattern.compile("^([^:]+):([^:]+)(:([^:]+))?$");
    private final Pattern notRegexPattern = Pattern.compile("^[A-Za-z0-9_\\.]*$");
    
    private final List<ArtifactFilter> includeArtifacts;
    private final List<ArtifactFilter> excludeArtifacts;
    
    public BanConfigurationParser(Plugin plugin) {
    public BanConfigurationParser(Plugin plugin) throws IOException, MojoFailureException {
        Xpp3Dom rootDom = (Xpp3Dom) plugin.getConfiguration();
        if (rootDom == null) {
            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());
        this.init(rootDom);
    }
    
}
Loading