/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed 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.guvnor.m2repo.backend.server.repositories; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.maven.model.DeploymentRepository; import org.apache.maven.model.DistributionManagement; import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.settings.Server; import org.apache.maven.settings.Settings; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.deployment.DeployRequest; import org.eclipse.aether.deployment.DeploymentException; import org.eclipse.aether.repository.Authentication; import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.repository.RepositoryPolicy; import org.guvnor.common.services.project.model.GAV; import org.kie.scanner.Aether; import org.kie.scanner.embedder.MavenEmbedder; import org.kie.scanner.embedder.MavenEmbedderException; import org.kie.scanner.embedder.MavenProjectLoader; import org.kie.scanner.embedder.MavenSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DistributionManagementArtifactRepository implements ArtifactRepository { private final String name; private Logger logger = LoggerFactory.getLogger(DistributionManagementArtifactRepository.class); public DistributionManagementArtifactRepository(final String name) { this.name = name; } @Override public String getName() { return name; } @Override public Collection<File> listFiles(final List<String> wildcards) { return Collections.EMPTY_LIST; } @Override public Collection<Artifact> listArtifacts(final List<String> wildcards) { return Collections.EMPTY_LIST; } @Override public boolean containsArtifact(final GAV gav) { return false; } @Override public File getArtifactFileFromRepository(final GAV gav) { return null; } @Override public void deploy(final String pom, final Artifact... artifacts) { try { MavenEmbedder embedder = MavenProjectLoader.newMavenEmbedder(false); DistributionManagement distributionManagement = getDistributionManagement(pom, embedder); if (distributionManagement != null) { final boolean isSnapshot = Arrays.stream(artifacts).anyMatch(artifact -> artifact.isSnapshot()); DeploymentRepository remoteRepository = null; if (isSnapshot) { remoteRepository = distributionManagement.getSnapshotRepository(); //Maven documentation states use of the regular repository if the SNAPSHOT repository is undefined //See https://maven.apache.org/pom.html#Repository and https://bugzilla.redhat.com/show_bug.cgi?id=1129573 if (remoteRepository == null) { remoteRepository = distributionManagement.getRepository(); } } else { remoteRepository = distributionManagement.getRepository(); } //If the user has configured a distribution management module in the pom then we will attempt to deploy there. //If credentials are required those credentials must be provisioned in the user's settings.xml file if (remoteRepository != null) { DeployRequest remoteRequest = new DeployRequest(); for (Artifact artifact : artifacts) { remoteRequest.addArtifact(artifact); } remoteRequest.setRepository(getRemoteRepoFromDeployment(remoteRepository, embedder)); Aether.getAether().getSystem().deploy(Aether.getAether().getSession(), remoteRequest); } } } catch (DeploymentException e) { throw new RuntimeException(e); } } private DistributionManagement getDistributionManagement(final String pomXML, final MavenEmbedder embedder) { final InputStream is = new ByteArrayInputStream(pomXML.getBytes(Charset.forName("UTF-8"))); MavenProject project = null; try { project = embedder.readProject(is); } catch (ProjectBuildingException e) { logger.error("Unable to build Maven project from POM", e); throw new RuntimeException(e); } catch (MavenEmbedderException e) { logger.error("Unable to build Maven project from POM", e); throw new RuntimeException(e); } finally { try { is.close(); } catch (IOException ioe) { //Swallow } } return project.getDistributionManagement(); } private RemoteRepository getRemoteRepoFromDeployment(final DeploymentRepository repo, final MavenEmbedder embedder) { RemoteRepository.Builder remoteRepoBuilder = new RemoteRepository.Builder(repo.getId(), repo.getLayout(), repo .getUrl()) .setSnapshotPolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_DAILY, RepositoryPolicy.CHECKSUM_POLICY_WARN)) .setReleasePolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_WARN)); Settings settings = MavenSettings.getSettings(); Server server = settings.getServer(repo.getId()); if (server != null) { Authentication authentication = embedder.getMavenSession().getRepositorySession() .getAuthenticationSelector() .getAuthentication(remoteRepoBuilder.build()); remoteRepoBuilder.setAuthentication(authentication); } return remoteRepoBuilder.build(); } @Override public void delete(final GAV gav) { } }