org.guvnor.common.services.project.backend.server.RepositoryResolverTestUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.guvnor.common.services.project.backend.server.RepositoryResolverTestUtils.java

Source

/*
 * 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";

    /**
     * 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.deployArtifact(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_ALWAYS,
                                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("    </profile>\n");
            settingsXmlLines.add("  </profiles>\n");
        }
        settingsXmlLines.add("</settings>");

        Files.write(settingsXmlPath, settingsXmlLines, StandardCharsets.UTF_8);

        return settingsXmlPath;
    }

}