Skip to content

Commit

Permalink
[SHRINKRES-85] fixed MavenModelResolver copies content sharing
Browse files Browse the repository at this point in the history
  • Loading branch information
mmatloka authored and ALRubinger committed Nov 14, 2012
1 parent 07fd767 commit 6db49cc
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,21 +69,27 @@ public MavenModelResolver(MavenRepositorySystem system, RepositorySystemSession
List<RemoteRepository> remoteRepositories) {
this.system = system;
this.session = session;
this.repositories = new ArrayList<RemoteRepository>(remoteRepositories);
this.repositoryIds = new HashSet<String>();

for (RemoteRepository repository : repositories) {
repositoryIds.add(repository.getId());
// RemoteRepository is mutable
this.repositories = new ArrayList<RemoteRepository>(remoteRepositories.size());
for (final RemoteRepository remoteRepository : remoteRepositories) {
this.repositories.add(new RemoteRepository(remoteRepository));
}

this.repositoryIds = new HashSet<String>(repositories.size());

for (final RemoteRepository repository : repositories) {
repositoryIds.add(repository.getId());
}
}

// a cloning constructor
private MavenModelResolver(MavenModelResolver clone) {
this.system = clone.system;
this.session = clone.session;
this.repositories = new ArrayList<RemoteRepository>(clone.repositories);
this.repositoryIds = new HashSet<String>(clone.repositoryIds);
/**
* Cloning constructor
*
* @param origin
*/
private MavenModelResolver(MavenModelResolver origin) {
this(origin.system, origin.session, origin.repositories);
}

/*
Expand Down Expand Up @@ -122,15 +128,15 @@ public ModelSource resolveModel(String groupId, String artifactId, String versio
throws UnresolvableModelException {
Artifact pomArtifact = new DefaultArtifact(groupId, artifactId, "", "pom", version);
try {
ArtifactRequest request = new ArtifactRequest(pomArtifact, repositories, null);
final ArtifactRequest request = new ArtifactRequest(pomArtifact, repositories, null);
pomArtifact = system.resolveArtifact(session, request).getArtifact();

} catch (ArtifactResolutionException e) {
throw new UnresolvableModelException("Failed to resolve POM for " + groupId + ":" + artifactId + ":"
+ version + " due to " + e.getMessage(), groupId, artifactId, version, e);
}

File pomFile = pomArtifact.getFile();
final File pomFile = pomArtifact.getFile();

return new FileModelSource(pomFile);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.jboss.shrinkwrap.resolver.impl.maven;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

import org.jboss.shrinkwrap.resolver.impl.maven.bootstrap.MavenRepositorySystem;
import org.jboss.shrinkwrap.resolver.impl.maven.internal.MavenModelResolver;
import org.junit.Assert;
import org.junit.Test;
import org.sonatype.aether.repository.RemoteRepository;

/**
* Test for {@link MavenModelResolver}.
*
* @author <a href="mailto:mmatloka@gmail.com">Michal Matloka</a>
*/
public class MavenModelResolverTest {

/**
* Tests if newCopy() gives independent instances.
*
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
@Test
public void shouldGiveNewIndependentRepositories() throws NoSuchFieldException, IllegalAccessException {
// given
final String initialId = "id";
final RemoteRepository remoteRepository = new RemoteRepository(initialId, "type", "url");
final MavenModelResolver mavenModelResolver = new MavenModelResolver(new MavenRepositorySystem(), null,
Arrays.asList(remoteRepository));

// when
final MavenModelResolver mavenModelResolverCopy = (MavenModelResolver) mavenModelResolver.newCopy();
remoteRepository.setId("otherId");

// then
// simulate access to repositories field, internal functions uses this field, e.g. to resolve model
final Field repositoriesField = MavenModelResolver.class.getDeclaredField("repositories");
repositoriesField.setAccessible(true);

@SuppressWarnings("unchecked")
final List<RemoteRepository> value = (List<RemoteRepository>) repositoriesField.get(mavenModelResolverCopy);
Assert.assertEquals("Internal value in copy has changed!", initialId, value.get(0).getId());
}
}

0 comments on commit 6db49cc

Please sign in to comment.