/*
* Copyright 2016 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.common.services.project.backend.server;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
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.settings.Server;
import org.apache.maven.settings.Settings;
import org.drools.compiler.kproject.ReleaseIdImpl;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
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.eclipse.aether.util.artifact.SubArtifact;
import org.kie.api.builder.ReleaseId;
import org.kie.scanner.Aether;
import org.kie.scanner.MavenRepository;
import org.kie.scanner.embedder.MavenSettings;
import static org.kie.scanner.MavenRepository.*;
public class RepositoryResolverTestUtils {
private static final String REPO_1 = "<repository>\n" +
"<id>jboss-origin-repository-group</id>\n" +
"<name>JBoss.org Public Repository Group</name>\n" +
"<url>https://origin-repository.jboss.org/nexus/content/groups/ea/</url>\n" +
"</repository>\n";
private static final String REPO_2 = "<repository>\n" +
"<id>jboss-developer-repository-group</id>\n" +
"<name>JBoss.org Developer Repository Group</name>\n" +
"<url>https://repository.jboss.org/nexus/content/groups/developer/</url>\n" +
"</repository>\n";
private static final String REPO_3 = "<repository>\n" +
"<id>jboss-public-repository-group</id>\n" +
"<name>JBoss Public Repository Group</name>\n" +
"<url>http://repository.jboss.org/nexus/content/groups/public/</url>\n" +
"</repository>\n";
//This intentionally has the same "id" as REPO_3
//See https://bugzilla.redhat.com/show_bug.cgi?id=1319046
private static final String PLUGIN_REPO_1 = "<pluginRepository>\n" +
"<id>jboss-public-repository-group</id>\n" +
"<name>JBoss Public Repository Group</name>\n" +
"<url>https://repository.jboss.org/nexus/content/repositories/snapshots/</url>\n" +
"</pluginRepository>\n";
/**
* Install a Maven Project to the local Maven Repository
* @param mavenProject
* @param pomXml
*/
public static void installArtifact( final MavenProject mavenProject,
final String pomXml ) {
final ReleaseId releaseId = new ReleaseIdImpl( mavenProject.getGroupId(),
mavenProject.getArtifactId(),
mavenProject.getVersion() );
final Aether aether = new Aether( mavenProject );
final MavenRepository mavenRepository = new MavenRepository( aether ) {
//Nothing to override, just a sub-class to expose Constructor
};
mavenRepository.installArtifact( releaseId,
"content".getBytes(),
pomXml.getBytes() );
}
/**
* Deploy a Maven Project to the 'Remote' Maven Repository defined in the Project's {code}<distribtionManagement>{code} section.
* @param mavenProject
* @param pomXml
*/
public static void deployArtifact( final MavenProject mavenProject,
final String pomXml ) {
final ReleaseId releaseId = new ReleaseIdImpl( mavenProject.getGroupId(),
mavenProject.getArtifactId(),
mavenProject.getVersion() );
//Create temporary files for the JAR and POM
final Aether aether = new Aether( mavenProject );
final File jarFile = new File( System.getProperty( "java.io.tmpdir" ),
toFileName( releaseId,
null ) + ".jar" );
try {
FileOutputStream fos = new FileOutputStream( jarFile );
fos.write( "content".getBytes() );
fos.flush();
fos.close();
} catch ( IOException e ) {
throw new RuntimeException( e );
}
final File pomFile = new File( System.getProperty( "java.io.tmpdir" ),
toFileName( releaseId,
null ) + ".pom" );
try {
FileOutputStream fos = new FileOutputStream( pomFile );
fos.write( pomXml.getBytes() );
fos.flush();
fos.close();
} catch ( IOException e ) {
throw new RuntimeException( e );
}
//Artifact representing the JAR
Artifact jarArtifact = new DefaultArtifact( releaseId.getGroupId(),
releaseId.getArtifactId(),
"jar",
releaseId.getVersion() );
jarArtifact = jarArtifact.setFile( jarFile );
//Artifact representing the POM
Artifact pomArtifact = new SubArtifact( jarArtifact,
"",
"pom" );
pomArtifact = pomArtifact.setFile( pomFile );
//Read <distributionManagement> section
final DistributionManagement distributionManagement = mavenProject.getDistributionManagement();
if ( distributionManagement != null ) {
final DeployRequest deployRequest = new DeployRequest();
deployRequest
.addArtifact( jarArtifact )
.addArtifact( pomArtifact )
.setRepository( getRemoteRepoFromDeployment( distributionManagement.getRepository(),
aether.getSession() ) );
try {
aether.getSystem().deploy( aether.getSession(),
deployRequest );
} catch ( DeploymentException e ) {
throw new RuntimeException( e );
}
}
}
//Convert a DeploymentRepository to a RemoteRepository
private static RemoteRepository getRemoteRepoFromDeployment( final DeploymentRepository deploymentRepository,
final RepositorySystemSession mavenSession ) {
final RemoteRepository.Builder remoteRepoBuilder = new RemoteRepository.Builder( deploymentRepository.getId(),
deploymentRepository.getLayout(),
deploymentRepository.getUrl() )
.setSnapshotPolicy( new RepositoryPolicy( true,
RepositoryPolicy.UPDATE_POLICY_DAILY,
RepositoryPolicy.CHECKSUM_POLICY_WARN ) )
.setReleasePolicy( new RepositoryPolicy( true,
RepositoryPolicy.UPDATE_POLICY_DAILY,
RepositoryPolicy.CHECKSUM_POLICY_WARN ) );
final Settings settings = MavenSettings.getSettings();
final Server server = settings.getServer( deploymentRepository.getId() );
if ( server != null ) {
final Authentication authentication = mavenSession
.getAuthenticationSelector()
.getAuthentication( remoteRepoBuilder.build() );
remoteRepoBuilder.setAuthentication( authentication );
}
return remoteRepoBuilder.build();
}
/**
* Generate a temporary settings.xml file.
* @param m2Folder
* @return
* @throws IOException
*/
public static java.nio.file.Path generateSettingsXml( final java.nio.file.Path m2Folder ) throws IOException {
final java.nio.file.Path settingsXmlPath = Files.createTempFile( m2Folder,
"settings",
".xml" );
final List<String> settingsXmlLines = new ArrayList<String>();
final List<String> additionalRepositories = new ArrayList<String>() {{
add( REPO_1 );
add( REPO_2 );
add( REPO_3 );
}};
settingsXmlLines.add( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" );
settingsXmlLines.add( "<settings>\n" );
settingsXmlLines.add( " <localRepository>" + m2Folder.toString() + "</localRepository>\n" );
if ( additionalRepositories.size() > 0 ) {
settingsXmlLines.add( " <profiles>\n" );
settingsXmlLines.add( " <profile>\n" );
settingsXmlLines.add( " <id>standard-extra-repos</id>\n" );
settingsXmlLines.add( " <activation>\n" );
settingsXmlLines.add( " <activeByDefault>true</activeByDefault>\n" );
settingsXmlLines.add( " </activation>\n" );
settingsXmlLines.add( " <repositories>\n" );
settingsXmlLines.addAll( additionalRepositories );
settingsXmlLines.add( " </repositories>\n" );
settingsXmlLines.add( " <pluginRepositories>\n" );
settingsXmlLines.add( PLUGIN_REPO_1 );
settingsXmlLines.add( " </pluginRepositories>\n" );
settingsXmlLines.add( " </profile>\n" );
settingsXmlLines.add( " </profiles>\n" );
}
settingsXmlLines.add( "</settings>" );
Files.write( settingsXmlPath,
settingsXmlLines,
StandardCharsets.UTF_8 );
return settingsXmlPath;
}
}