Skip to content

Commit

Permalink
[DROOLS-1556] implement support for proxies in kie-ci (apache#1254)
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed May 9, 2017
1 parent b4a6408 commit 05fb0d2
Show file tree
Hide file tree
Showing 6 changed files with 185 additions and 43 deletions.
40 changes: 20 additions & 20 deletions kie-ci/src/main/java/org/kie/scanner/Aether.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@

package org.kie.scanner;

import java.io.File;
import java.util.Collection;
import java.util.HashSet;

import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.apache.maven.settings.Settings;
Expand All @@ -26,20 +30,18 @@
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.impl.DefaultServiceLocator;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.Proxy;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.transport.file.FileTransporterFactory;
import org.eclipse.aether.transport.http.HttpTransporterFactory;
import org.eclipse.aether.transport.wagon.WagonProvider;
import org.eclipse.aether.util.repository.DefaultProxySelector;
import org.kie.scanner.embedder.MavenSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.Collection;
import java.util.HashSet;

import static org.kie.scanner.embedder.MavenProjectLoader.loadMavenProject;

public class Aether {
Expand All @@ -57,32 +59,23 @@ public class Aether {

private RemoteRepository localRepository;

public Aether( String localRepoDir,
boolean offline ) {
this( loadMavenProject( offline ), localRepoDir, offline );
}

public Aether( MavenProject mavenProject ) {
this( mavenProject,
MavenSettings.getSettings().getLocalRepository(),
MavenSettings.getSettings().isOffline() );
this( MavenSettings.getSettings(), mavenProject );
}

public static synchronized Aether getAether() {
if ( instance == null ) {
Settings settings = MavenSettings.getSettings();
instance = new Aether( settings.getLocalRepository(), settings.isOffline() );
instance = new Aether( settings, loadMavenProject( settings.isOffline() ) );
}
return instance;
}

private Aether( MavenProject mavenProject,
String localRepoDir,
boolean offline ) {
this.localRepoDir = localRepoDir;
this.offline = offline;
private Aether( Settings settings, MavenProject mavenProject ) {
this.localRepoDir = settings.getLocalRepository();
this.offline = settings.isOffline();
system = newRepositorySystem();
session = newRepositorySystemSession( system );
session = newRepositorySystemSession( settings, system );
repositories = initRepositories( mavenProject );
}

Expand Down Expand Up @@ -110,11 +103,18 @@ private RepositorySystem newRepositorySystem() {
return locator.getService( RepositorySystem.class );
}

private RepositorySystemSession newRepositorySystemSession( RepositorySystem system ) {
private RepositorySystemSession newRepositorySystemSession( Settings settings, RepositorySystem system ) {
LocalRepository localRepo = new LocalRepository( localRepoDir );
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, localRepo ) );
session.setOffline( offline );
if (!settings.getProxies().isEmpty()) {
DefaultProxySelector proxySelector = new DefaultProxySelector();
for (org.apache.maven.settings.Proxy proxy : settings.getProxies()) {
proxySelector.add( new Proxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort()), proxy.getNonProxyHosts() );
}
session.setProxySelector( proxySelector );
}
return session;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@

package org.kie.scanner;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;

import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.Authentication;
Expand All @@ -23,16 +27,14 @@
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Profile;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Repository;
import org.apache.maven.settings.RepositoryPolicy;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.util.repository.AuthenticationBuilder;

import java.util.Collection;
import java.util.HashSet;

public class MavenRepositoryConfiguration {

private final Settings settings;
Expand All @@ -47,6 +49,10 @@ public MavenRepositoryConfiguration( Settings settings ) {
this.artifactRepositoriesForRequest = initArtifactRepositories();
}

public List<Proxy> getProxies() {
return settings.getProxies();
}

public Collection<RemoteRepository> getExtraRepositories() {
return extraRepositories;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,11 +166,15 @@ protected MavenExecutionRequest buildMavenExecutionRequest( MavenRequest mavenRe
}
}

MavenRepositoryConfiguration mavenRepoConf = getMavenRepositoryConfiguration();

//DROOLS-899: Copy repositories defined in settings to execution request
for ( ArtifactRepository artifactRepository : getMavenRepositoryConfiguration().getArtifactRepositoriesForRequest() ) {
for ( ArtifactRepository artifactRepository : mavenRepoConf.getArtifactRepositoriesForRequest() ) {
mavenExecutionRequest.addRemoteRepository( artifactRepository );
}

mavenExecutionRequest.setProxies( mavenRepoConf.getProxies() );

mavenExecutionRequest.setLoggingLevel( mavenRequest.getLoggingLevel() );

componentProvider.lookup( Logger.class ).setThreshold( mavenRequest.getLoggingLevel() );
Expand Down Expand Up @@ -359,6 +363,10 @@ public MavenSession getMavenSession() {
return mavenSession;
}

public MavenExecutionRequest getMavenExecutionRequest() {
return mavenExecutionRequest;
}

public void dispose() {
PlexusContainer plexusContainer = componentProvider.getPlexusContainer();
if ( plexusContainer != null ) {
Expand Down
68 changes: 68 additions & 0 deletions kie-ci/src/test/java/org/kie/scanner/AetherTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* 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.kie.scanner;

import org.eclipse.aether.repository.Proxy;
import org.eclipse.aether.repository.RemoteRepository;
import org.junit.Test;
import org.kie.scanner.embedder.MavenSettings;

import static org.junit.Assert.assertEquals;
import static org.kie.scanner.embedder.MavenSettings.CUSTOM_SETTINGS_PROPERTY;

public class AetherTest {

private final String SETTINGS_WITH_PROXY =
"<settings xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"\n" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xsi:schemaLocation=\"http://maven.apache.org/SETTINGS/1.0.0\n" +
" http://maven.apache.org/xsd/settings-1.0.0.xsd\">" +
" <proxies>\n" +
" <proxy>\n" +
" <id>MyProxy</id>\n" +
" <active>true</active>\n" +
" <protocol>http</protocol>\n" +
" <host>localhost</host>\n" +
" <port>8888</port>\n" +
" </proxy>\n" +
" </proxies>" +
"</settings>\n";

@Test
public void testProxies() {
String oldSettingsXmlPath = System.getProperty( CUSTOM_SETTINGS_PROPERTY );
try {
if (oldSettingsXmlPath != null) {
System.clearProperty( CUSTOM_SETTINGS_PROPERTY );
}
MavenSettings.reinitSettingsFromString( SETTINGS_WITH_PROXY );

Aether aether = Aether.getAether();
RemoteRepository remoteRepository = new RemoteRepository.Builder( "local", "default", "http://myserver.com" ).build();
Proxy proxy = aether.getSession().getProxySelector().getProxy( remoteRepository );
assertEquals("http", proxy.getType());
assertEquals("localhost", proxy.getHost());
assertEquals(8888, proxy.getPort());

} finally {
if (oldSettingsXmlPath != null) {
System.setProperty( CUSTOM_SETTINGS_PROPERTY, oldSettingsXmlPath );
}
MavenSettings.reinitSettings();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,24 @@

package org.kie.scanner.embedder;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.building.DefaultSettingsBuilderFactory;
import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
import org.apache.maven.settings.building.SettingsBuilder;
import org.apache.maven.settings.building.SettingsBuildingException;
import org.apache.maven.settings.building.SettingsSource;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.junit.Test;
import org.kie.scanner.MavenRepositoryConfiguration;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import static org.drools.core.util.IoUtils.readFileAsString;
import static org.junit.Assert.*;
import static org.kie.scanner.embedder.MavenSettings.CUSTOM_SETTINGS_PROPERTY;
Expand All @@ -54,8 +54,8 @@ public void testExternalRepositories() {
MavenSettings.reinitSettingsFromString(EMPTY_SETTINGS);

final MavenRequest mavenRequest = createMavenRequest(null);
final MavenEmbedder embedder = new MavenEmbedderMock( mavenRequest );
final MavenExecutionRequest request = embedder.buildMavenExecutionRequest( mavenRequest );
final MavenEmbedder embedder = new MavenEmbedderWithRepoMock( mavenRequest );
final MavenExecutionRequest request = embedder.getMavenExecutionRequest();

assertNotNull( request );

Expand All @@ -69,9 +69,6 @@ public void testExternalRepositories() {

} catch ( MavenEmbedderException mee ) {
fail( mee.getMessage() );

} catch ( ComponentLookupException cle ) {
fail( cle.getMessage() );
} finally {
if (oldSettingsXmlPath != null) {
System.setProperty( CUSTOM_SETTINGS_PROPERTY, oldSettingsXmlPath );
Expand All @@ -84,24 +81,50 @@ public void testExternalRepositories() {
public void testCustomSettingSource() {
try {
final MavenRequest mavenRequest = createMavenRequest(new SettingsSourceMock( "<settings/>" ) );
final MavenEmbedder embedder = new MavenEmbedderMock( mavenRequest );
final MavenExecutionRequest request = embedder.buildMavenExecutionRequest( mavenRequest );
final MavenEmbedder embedder = new MavenEmbedderWithRepoMock( mavenRequest );
final MavenExecutionRequest request = embedder.getMavenExecutionRequest();

assertNotNull( request );

assertEquals( "<settings/>", readFileAsString( request.getUserSettingsFile() ).trim() );

} catch ( MavenEmbedderException mee ) {
fail( mee.getMessage() );
}
}

@Test
public void testProxies() {
String oldSettingsXmlPath = System.getProperty( CUSTOM_SETTINGS_PROPERTY );
try {
if (oldSettingsXmlPath != null) {
System.clearProperty( CUSTOM_SETTINGS_PROPERTY );
}
MavenSettings.reinitSettingsFromString(EMPTY_SETTINGS);

final MavenRequest mavenRequest = createMavenRequest(null);
final MavenEmbedder embedder = new MavenEmbedderWithProxyMock( mavenRequest );
final MavenExecutionRequest request = embedder.getMavenExecutionRequest();

assertNotNull( request );

final List<Proxy> proxies = request.getProxies();
assertEquals( 1, proxies.size() );
assertEquals( "MyProxy", proxies.get(0).getId() );

} catch ( ComponentLookupException cle ) {
fail( cle.getMessage() );
} catch ( MavenEmbedderException mee ) {
fail( mee.getMessage() );
} finally {
if (oldSettingsXmlPath != null) {
System.setProperty( CUSTOM_SETTINGS_PROPERTY, oldSettingsXmlPath );
}
MavenSettings.reinitSettings();
}
}

public static class MavenEmbedderMock extends MavenEmbedder {
public static abstract class MavenEmbedderMock extends MavenEmbedder {

public MavenEmbedderMock( final MavenRequest mavenRequest ) throws MavenEmbedderException {
public MavenEmbedderMock( MavenRequest mavenRequest ) throws MavenEmbedderException {
super( mavenRequest );
}

Expand All @@ -112,7 +135,7 @@ protected MavenRepositoryConfiguration getMavenRepositoryConfiguration() {

private Settings getMavenSettings() {
String path = getClass().getResource( "." ).toString().substring( "file:".length() );
File testSettingsFile = new File( path + "settings_with_repositories.xml" );
File testSettingsFile = new File( path + getSettingsFile() );
assertTrue( testSettingsFile.exists() );

SettingsBuilder settingsBuilder = new DefaultSettingsBuilderFactory().newInstance();
Expand All @@ -125,6 +148,32 @@ private Settings getMavenSettings() {
throw new RuntimeException( e );
}
}

protected abstract String getSettingsFile();
}

public static class MavenEmbedderWithRepoMock extends MavenEmbedderMock {

public MavenEmbedderWithRepoMock( MavenRequest mavenRequest ) throws MavenEmbedderException {
super( mavenRequest );
}

@Override
protected String getSettingsFile() {
return "settings_with_repositories.xml";
}
}

public static class MavenEmbedderWithProxyMock extends MavenEmbedderMock {

public MavenEmbedderWithProxyMock( MavenRequest mavenRequest ) throws MavenEmbedderException {
super( mavenRequest );
}

@Override
protected String getSettingsFile() {
return "settings_with_proxies.xml";
}
}

private static MavenRequest createMavenRequest(SettingsSource settingsSource) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<settings>
<proxies>
<proxy>
<id>MyProxy</id>
<active>true</active>
<protocol>http</protocol>
<host>localhost</host>
<port>8888</port>
</proxy>
</proxies>
</settings>

0 comments on commit 05fb0d2

Please sign in to comment.