Java tutorial
/* * 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; } }