Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Fedorenko2015-02-26 21:33:05 +0000
committerIgor Fedorenko2015-02-26 21:33:05 +0000
commit991a764bb4db30013b4f0f761baefedc5ce58cc5 (patch)
treed44077d517610b5f974852457a466b9cc0d0c0dc
parentee83f27b96f2b3160981d41ae10dd29bcf7b42bd (diff)
downloadm2e-core-991a764bb4db30013b4f0f761baefedc5ce58cc5.tar.gz
m2e-core-991a764bb4db30013b4f0f761baefedc5ce58cc5.tar.xz
m2e-core-991a764bb4db30013b4f0f761baefedc5ce58cc5.zip
460983 support version ranges when resolved artifacts from workspace
Change-Id: I2a8dbc9b5214354d86c544d4a8b9b62ebb5f74e2 Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/BasicProjectRegistry.java16
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/EclipseWorkspaceArtifactRepository.java41
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/IProjectRegistry.java5
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/MutableProjectRegistry.java7
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistry.java6
5 files changed, 64 insertions, 11 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/BasicProjectRegistry.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/BasicProjectRegistry.java
index cae366e4..0e9ecb7d 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/BasicProjectRegistry.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/BasicProjectRegistry.java
@@ -13,12 +13,16 @@ package org.eclipse.m2e.core.internal.project.registry;
import java.io.File;
import java.io.Serializable;
+import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
import org.eclipse.core.resources.IFile;
import org.eclipse.m2e.core.embedder.ArtifactKey;
@@ -129,9 +133,15 @@ abstract class BasicProjectRegistry implements Serializable {
return workspacePoms.values().toArray(new MavenProjectFacade[workspacePoms.size()]);
}
- public IFile getWorkspaceArtifact(ArtifactKey key) {
- Set<IFile> paths = workspaceArtifacts.get(key);
- return paths == null || paths.isEmpty() ? null : paths.iterator().next();
+ public Map<ArtifactKey, Collection<IFile>> getWorkspaceArtifacts(String groupId, String artifactId) {
+ Multimap<ArtifactKey, IFile> artifacts = HashMultimap.create();
+ for(Map.Entry<ArtifactKey, Set<IFile>> entry : workspaceArtifacts.entrySet()) {
+ ArtifactKey workspaceKey = entry.getKey();
+ if(groupId.equals(workspaceKey.getGroupId()) && artifactId.equals(workspaceKey.getArtifactId())) {
+ artifacts.putAll(workspaceKey, entry.getValue());
+ }
+ }
+ return artifacts.asMap();
}
protected void clear() {
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/EclipseWorkspaceArtifactRepository.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/EclipseWorkspaceArtifactRepository.java
index 413191ff..326ff942 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/EclipseWorkspaceArtifactRepository.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/EclipseWorkspaceArtifactRepository.java
@@ -13,11 +13,18 @@ package org.eclipse.m2e.core.internal.project.registry;
import java.io.File;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.repository.WorkspaceReader;
import org.eclipse.aether.repository.WorkspaceRepository;
+import org.eclipse.aether.util.version.GenericVersionScheme;
+import org.eclipse.aether.version.InvalidVersionSpecificationException;
+import org.eclipse.aether.version.Version;
+import org.eclipse.aether.version.VersionConstraint;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IWorkspaceRoot;
@@ -30,6 +37,7 @@ import org.eclipse.m2e.core.embedder.ArtifactKey;
public final class EclipseWorkspaceArtifactRepository extends LocalArtifactRepository implements WorkspaceReader {
+ private static final GenericVersionScheme versionScheme = new GenericVersionScheme();
private final transient ProjectRegistryManager.Context context;
@@ -53,8 +61,7 @@ public final class EclipseWorkspaceArtifactRepository extends LocalArtifactRepos
}
// check in the workspace, note that workspace artifacts never have classifiers
- ArtifactKey key = new ArtifactKey(groupId, artifactId, baseVersion, null);
- IFile pom = context.state.getWorkspaceArtifact(key);
+ IFile pom = getWorkspaceArtifact(groupId, artifactId, baseVersion);
if(pom == null || !pom.isAccessible()) {
return null;
}
@@ -85,6 +92,36 @@ public final class EclipseWorkspaceArtifactRepository extends LocalArtifactRepos
return null;
}
+ private IFile getWorkspaceArtifact(String groupId, String artifactId, String version) {
+ Map<ArtifactKey, Collection<IFile>> workspaceArtifacts = context.state.getWorkspaceArtifacts(groupId, artifactId);
+ if(workspaceArtifacts.isEmpty()) {
+ return null;
+ }
+ VersionConstraint constraint;
+ try {
+ constraint = versionScheme.parseVersionConstraint(version);
+ } catch(InvalidVersionSpecificationException e) {
+ return null; // broken version range spec does not match anything
+ }
+ TreeMap<Version, ArtifactKey> matchingArtifacts = new TreeMap<>();
+ // in vast majority of cases there will be single workspace artifact with matching groupId and artifactId
+ for(ArtifactKey workspaceArtifact : workspaceArtifacts.keySet()) {
+ try {
+ Version workspaceVersion = versionScheme.parseVersion(workspaceArtifact.getVersion());
+ if(constraint.containsVersion(workspaceVersion)) {
+ matchingArtifacts.put(workspaceVersion, workspaceArtifact);
+ }
+ } catch(InvalidVersionSpecificationException e) {
+ // this can't happen with GenericVersionScheme
+ }
+ }
+ if(matchingArtifacts.isEmpty()) {
+ return null;
+ }
+ ArtifactKey matchingArtifact = matchingArtifacts.values().iterator().next();
+ return workspaceArtifacts.get(matchingArtifact).iterator().next();
+ }
+
public File findArtifact(Artifact artifact) {
return resolveAsEclipseProject(artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion(),
artifact.getClassifier(), artifact.getExtension());
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/IProjectRegistry.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/IProjectRegistry.java
index c13fc6c6..deab0b7f 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/IProjectRegistry.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/IProjectRegistry.java
@@ -11,6 +11,9 @@
package org.eclipse.m2e.core.internal.project.registry;
+import java.util.Collection;
+import java.util.Map;
+
import org.eclipse.core.resources.IFile;
import org.eclipse.m2e.core.embedder.ArtifactKey;
@@ -29,6 +32,6 @@ public interface IProjectRegistry {
public MavenProjectFacade[] getProjects();
- public IFile getWorkspaceArtifact(ArtifactKey key);
+ public Map<ArtifactKey, Collection<IFile>> getWorkspaceArtifacts(String groupId, String artifactId);
}
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/MutableProjectRegistry.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/MutableProjectRegistry.java
index 1804b760..96f74aa8 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/MutableProjectRegistry.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/MutableProjectRegistry.java
@@ -12,6 +12,7 @@
package org.eclipse.m2e.core.internal.project.registry;
import java.io.File;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -160,11 +161,11 @@ public class MutableProjectRegistry extends BasicProjectRegistry implements IPro
return super.getProjects();
}
- public IFile getWorkspaceArtifact(ArtifactKey key) {
+ public Map<ArtifactKey, Collection<IFile>> getWorkspaceArtifacts(String groupId, String artifactId) {
if(isClosed()) {
- return parent.getWorkspaceArtifact(key);
+ return parent.getWorkspaceArtifacts(groupId, artifactId);
}
- return super.getWorkspaceArtifact(key);
+ return super.getWorkspaceArtifacts(groupId, artifactId);
}
// low level access and manipulation
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistry.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistry.java
index 12f612ff..84ae5ec3 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistry.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistry.java
@@ -13,7 +13,9 @@ package org.eclipse.m2e.core.internal.project.registry;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
@@ -47,8 +49,8 @@ public class ProjectRegistry extends BasicProjectRegistry implements Serializabl
return super.getProjects();
}
- public synchronized IFile getWorkspaceArtifact(ArtifactKey key) {
- return super.getWorkspaceArtifact(key);
+ public synchronized Map<ArtifactKey, Collection<IFile>> getWorkspaceArtifacts(String groupId, String artifactId) {
+ return super.getWorkspaceArtifacts(groupId, artifactId);
}
public synchronized List<MavenProjectChangedEvent> apply(MutableProjectRegistry newState)

Back to the top