| package org.apache.maven.plugins.enforcer; |
| |
| /* |
| * 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.Collections; |
| import java.util.List; |
| |
| import org.apache.maven.enforcer.rule.api.EnforcerRuleException; |
| import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; |
| import org.apache.maven.execution.MavenSession; |
| import org.apache.maven.model.Model; |
| import org.apache.maven.model.Repository; |
| import org.apache.maven.plugin.logging.Log; |
| import org.apache.maven.project.MavenProject; |
| import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; |
| import org.codehaus.plexus.util.StringUtils; |
| |
| /** |
| * This rule checks that this pom or its parents don't define a repository. |
| * |
| * @author <a href="mailto:brianf@apache.org">Brian Fox</a> |
| */ |
| public class RequireNoRepositories |
| extends AbstractNonCacheableEnforcerRule |
| { |
| private static final String VERSION = " version:"; |
| |
| /** |
| * Whether to ban non-plugin repositories. By default they are banned. |
| * |
| * @see #setBanRepositories(boolean) |
| */ |
| private boolean banRepositories = true; |
| |
| /** |
| * Whether to ban plugin repositories. By default they are banned. |
| * |
| * @see #setBanPluginRepositories(boolean) |
| */ |
| private boolean banPluginRepositories = true; |
| |
| /** |
| * Specify explicitly allowed non-plugin repositories. This is a list of ids. |
| * |
| * @see #setAllowedRepositories(List) |
| */ |
| private List<String> allowedRepositories = Collections.emptyList(); |
| |
| /** |
| * Specify explicitly allowed plugin repositories. This is a list of ids. |
| * |
| * @see #setAllowedPluginRepositories(List) |
| */ |
| private List<String> allowedPluginRepositories = Collections.emptyList(); |
| |
| /** |
| * Whether to allow repositories which only resolve snapshots. By default they are banned. |
| * |
| * @see #setAllowSnapshotRepositories(boolean) |
| */ |
| private boolean allowSnapshotRepositories = false; |
| |
| /** |
| * Whether to allow plugin repositories which only resolve snapshots. By default they are banned. |
| * |
| * @see {@link #setAllowSnapshotPluginRepositories(boolean)} |
| */ |
| private boolean allowSnapshotPluginRepositories = false; |
| |
| public final void setBanRepositories( boolean banRepositories ) |
| { |
| this.banRepositories = banRepositories; |
| } |
| |
| public final void setBanPluginRepositories( boolean banPluginRepositories ) |
| { |
| this.banPluginRepositories = banPluginRepositories; |
| } |
| |
| public final void setAllowedRepositories( List<String> allowedRepositories ) |
| { |
| this.allowedRepositories = allowedRepositories; |
| } |
| |
| public final void setAllowedPluginRepositories( List<String> allowedPluginRepositories ) |
| { |
| this.allowedPluginRepositories = allowedPluginRepositories; |
| } |
| |
| public final void setAllowSnapshotRepositories( boolean allowSnapshotRepositories ) |
| { |
| this.allowSnapshotRepositories = allowSnapshotRepositories; |
| } |
| |
| public final void setAllowSnapshotPluginRepositories( boolean allowSnapshotPluginRepositories ) |
| { |
| this.allowSnapshotPluginRepositories = allowSnapshotPluginRepositories; |
| } |
| |
| @Override |
| public void execute( EnforcerRuleHelper helper ) |
| throws EnforcerRuleException |
| { |
| Log logger = helper.getLog(); |
| |
| MavenSession session; |
| try |
| { |
| session = (MavenSession) helper.evaluate( "${session}" ); |
| |
| List<MavenProject> sortedProjects = session.getProjectDependencyGraph().getSortedProjects(); |
| |
| List<Model> models = new ArrayList<>(); |
| for ( MavenProject mavenProject : sortedProjects ) |
| { |
| logger.debug( "Scanning project: " + mavenProject.getGroupId() + ":" + mavenProject.getArtifactId() |
| + VERSION + mavenProject.getVersion() ); |
| models.add( mavenProject.getOriginalModel() ); |
| } |
| |
| List<Model> badModels = new ArrayList<>(); |
| |
| StringBuilder newMsg = new StringBuilder(); |
| newMsg.append( "Some poms have repositories defined:" + System.lineSeparator() ); |
| |
| for ( Model model : models ) |
| { |
| if ( banRepositories ) |
| { |
| List<Repository> repos = model.getRepositories(); |
| if ( repos != null && !repos.isEmpty() ) |
| { |
| List<String> bannedRepos = |
| findBannedRepositories( repos, allowedRepositories, allowSnapshotRepositories ); |
| if ( !bannedRepos.isEmpty() ) |
| { |
| badModels.add( model ); |
| newMsg.append( |
| model.getGroupId() + ":" + model.getArtifactId() + VERSION + model.getVersion() |
| + " has repositories " + bannedRepos ); |
| } |
| } |
| } |
| if ( banPluginRepositories ) |
| { |
| List<Repository> repos = model.getPluginRepositories(); |
| if ( repos != null && !repos.isEmpty() ) |
| { |
| List<String> bannedRepos = |
| findBannedRepositories( repos, allowedPluginRepositories, allowSnapshotPluginRepositories ); |
| if ( !bannedRepos.isEmpty() ) |
| { |
| badModels.add( model ); |
| newMsg.append( |
| model.getGroupId() + ":" + model.getArtifactId() + VERSION + model.getVersion() |
| + " has plugin repositories " + bannedRepos ); |
| } |
| } |
| } |
| } |
| |
| // if anything was found, log it then append the |
| // optional message. |
| if ( !badModels.isEmpty() ) |
| { |
| String message = getMessage(); |
| if ( StringUtils.isNotEmpty( message ) ) |
| { |
| newMsg.append( message ); |
| } |
| |
| throw new EnforcerRuleException( newMsg.toString() ); |
| } |
| |
| } |
| catch ( ExpressionEvaluationException e ) |
| { |
| throw new EnforcerRuleException( e.getLocalizedMessage() ); |
| } |
| } |
| |
| /** |
| * |
| * @param repos all repositories, never {@code null} |
| * @param allowedRepos allowed repositories, never {@code null} |
| * @param allowSnapshots |
| * @return List of banned repositoreis. |
| */ |
| private static List<String> findBannedRepositories( List<Repository> repos, List<String> allowedRepos, |
| boolean allowSnapshots ) |
| { |
| List<String> bannedRepos = new ArrayList<>( allowedRepos.size() ); |
| for ( Repository r : repos ) |
| { |
| if ( !allowedRepos.contains( r.getId() ) ) |
| { |
| if ( !allowSnapshots || r.getReleases() == null || r.getReleases().isEnabled() ) |
| { |
| // if we are not allowing snapshots and this repo is enabled for releases |
| // it is banned. We don't care whether it is enabled for snapshots |
| // if you define a repo and don't enable it for anything, then we have nothing |
| // to worry about |
| bannedRepos.add( r.getId() ); |
| } |
| } |
| } |
| return bannedRepos; |
| } |
| } |