diff options
author | Jason van Zyl | 2013-05-12 16:05:26 +0000 |
---|---|---|
committer | Jason van Zyl | 2013-05-12 16:05:26 +0000 |
commit | 9a9db64704687ac601d54626dd84db5a2d387bfc (patch) | |
tree | 67c7c157d545a5e94e03985ec15612355f3fc2d9 /org.eclipse.m2e.core | |
parent | 784ec22a9361bef020777cb8c11433b31c027bc2 (diff) | |
parent | 6677bc514714d2a7a6a10f572ba8b949636f7e21 (diff) | |
download | m2e-core-9a9db64704687ac601d54626dd84db5a2d387bfc.tar.gz m2e-core-9a9db64704687ac601d54626dd84db5a2d387bfc.tar.xz m2e-core-9a9db64704687ac601d54626dd84db5a2d387bfc.zip |
Merge branch 'master' into runtime
Diffstat (limited to 'org.eclipse.m2e.core')
6 files changed, 113 insertions, 28 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/IMavenConstants.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/IMavenConstants.java index 8c417d89..4591b921 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/IMavenConstants.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/IMavenConstants.java @@ -89,6 +89,11 @@ public interface IMavenConstants { public static final String MARKER_ATTR_VERSION = "version";//$NON-NLS-1$ + /** + * @since 1.4.0 + */ + public static final String MARKER_ATTR_CLASSIFIER = "classifier";//$NON-NLS-1$ + public static final String EDITOR_HINT_PARENT_GROUP_ID = "parent_groupid";//$NON-NLS-1$ public static final String EDITOR_HINT_PARENT_VERSION = "parent_version";//$NON-NLS-1$ diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java index 9faf9596..6562d046 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java @@ -197,11 +197,22 @@ public class MavenBuilder extends IncrementalProjectBuilder implements DeltaProv /*package*/IMavenProjectFacade getProjectFacade(final IFile pomResource, final IProject project, final IProgressMonitor monitor) throws CoreException { + + // facade refresh should be forced whenever pom.xml has changed + // there is no delta info for full builds + // but these are usually forced from Project/Clean + // so assume pom did not change + boolean force = false; + IResourceDelta delta = getDelta(project); + if(delta != null) { + delta = delta.findMember(pomResource.getFullPath()); + force = delta != null && delta.getKind() == IResourceDelta.CHANGED; + } IMavenProjectFacade projectFacade = projectManager.create(getProject(), monitor); - if(delta == null || projectFacade == null || projectFacade.isStale()) { + if(force || projectFacade == null || projectFacade.isStale()) { projectManager.refresh(Collections.singleton(pomResource), monitor); projectFacade = projectManager.create(project, monitor); if(projectFacade == null) { diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExternalRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExternalRuntime.java index 3603d7fb..e539678f 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExternalRuntime.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExternalRuntime.java @@ -74,9 +74,14 @@ public class MavenExternalRuntime implements MavenRuntime { } private File getLauncherConfigurationFile() { - return new File(location, "bin/m2.conf"); //$NON-NLS-1$ + File m2Conf = new File(location, "bin/m2.conf"); + // Look for Tesla location + if(m2Conf.exists() == false) { + m2Conf = new File(location, "conf/m2.conf"); + } + return m2Conf; //$NON-NLS-1$ } - + public void createLauncherConfiguration(final IMavenLauncherConfiguration collector, IProgressMonitor monitor) throws CoreException { diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/markers/ArtifactNotFoundProblemInfo.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/markers/ArtifactNotFoundProblemInfo.java index 130d79ce..243c31aa 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/markers/ArtifactNotFoundProblemInfo.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/markers/ArtifactNotFoundProblemInfo.java @@ -11,10 +11,14 @@ package org.eclipse.m2e.core.internal.markers; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; import org.eclipse.osgi.util.NLS; import org.sonatype.aether.artifact.Artifact; +import org.eclipse.m2e.core.internal.IMavenConstants; + public class ArtifactNotFoundProblemInfo extends MavenProblemInfo { private final Artifact artifact; @@ -35,4 +39,19 @@ public class ArtifactNotFoundProblemInfo extends MavenProblemInfo { public Artifact getArtifact() { return this.artifact; } + + /** + * Adds the missing artifact groupId, artifactId, version and classifier as marker attributes. + * + * @since 1.4.0 + */ + public void processMarker(IMarker marker) throws CoreException { + super.processMarker(marker); + if(artifact != null) { + marker.setAttribute(IMavenConstants.MARKER_ATTR_GROUP_ID, artifact.getGroupId()); + marker.setAttribute(IMavenConstants.MARKER_ATTR_ARTIFACT_ID, artifact.getArtifactId()); + marker.setAttribute(IMavenConstants.MARKER_ATTR_VERSION, artifact.getVersion()); + marker.setAttribute(IMavenConstants.MARKER_ATTR_CLASSIFIER, artifact.getClassifier()); + } + } } diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java index 2ee5e1ff..3d44b409 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java @@ -340,31 +340,46 @@ public class ProjectConfigurationManager implements IProjectConfigurationManager //project names to the errors encountered when updating them Map<String, IStatus> updateStatus = new HashMap<String, IStatus>(); - // refresh projects and update all dependencies - // this will ensure that project registry is up-to-date on GAV of all projects being updated - // TODO this sends multiple update events, rework using low-level registry update methods - for(IFile pom : pomFiles) { - if(monitor.isCanceled()) { - throw new OperationCanceledException(); - } - - IProject project = pom.getProject(); + List<IFile> pomsToRefresh = new ArrayList<IFile>(); - monitor.subTask(project.getName()); + // refresh from local filesystem + if(refreshFromLocal) { + for(IFile pom : pomFiles) { + if(monitor.isCanceled()) { + throw new OperationCanceledException(); + } - try { - if(refreshFromLocal) { + IProject project = pom.getProject(); + try { project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 1, SubProgressMonitor.SUPPRESS_SUBTASK_LABEL)); + pomsToRefresh.add(pom); + } catch(CoreException ex) { + updateStatus.put(project.getName(), ex.getStatus()); } - projectManager.refresh(Collections.singleton(pom), new SubProgressMonitor(monitor, 1, - SubProgressMonitor.SUPPRESS_SUBTASK_LABEL)); + } + } else { + pomsToRefresh.addAll(pomFiles); + } + + // refresh projects and update all dependencies + // this will ensure that project registry is up-to-date on GAV of all projects being updated + // TODO this sends multiple update events, rework using low-level registry update methods + try { + projectManager.refresh(pomsToRefresh, new SubProgressMonitor(monitor, pomFiles.size())); + + for(IFile pom : pomsToRefresh) { + IProject project = pom.getProject(); IMavenProjectFacade facade = projectManager.getProject(project); if(facade != null) { // facade is null if pom.xml cannot be read projects.put(pom, facade); } updateStatus.put(project.getName(), Status.OK_STATUS); - } catch(CoreException ex) { + } + } catch(CoreException ex) { + // TODO per-project status + for(IFile pom : pomsToRefresh) { + IProject project = pom.getProject(); updateStatus.put(project.getName(), ex.getStatus()); } } diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/WorkspaceStateWriter.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/WorkspaceStateWriter.java index cc3c1c1e..feffab14 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/WorkspaceStateWriter.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/WorkspaceStateWriter.java @@ -22,15 +22,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.QualifiedName; -import org.apache.maven.artifact.Artifact; +import org.apache.maven.project.MavenProject; +import org.eclipse.m2e.core.embedder.ArtifactKey; import org.eclipse.m2e.core.internal.project.registry.MavenProjectManager; import org.eclipse.m2e.core.project.IMavenProjectChangedListener; import org.eclipse.m2e.core.project.IMavenProjectFacade; @@ -41,6 +44,8 @@ import org.eclipse.m2e.core.project.MavenProjectChangedEvent; * Maintains map file of maven artifacts present in workspace. */ public class WorkspaceStateWriter implements IMavenProjectChangedListener { + private static QualifiedName PPROP_EXTENSION = new QualifiedName(WorkspaceStateWriter.class.getName(), "extension"); //$NON-NLS-1$ + private static final Logger log = LoggerFactory.getLogger(WorkspaceStateWriter.class); private MavenProjectManager projectManager; @@ -55,28 +60,47 @@ public class WorkspaceStateWriter implements IMavenProjectChangedListener { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); for(IMavenProjectFacade projectFacade : projectManager.getProjects()) { - if(!projectFacade.getProject().isAccessible()) { - log.debug("Project registry contains closed project {}", projectFacade.getProject()); + IProject project = projectFacade.getProject(); + if(!project.isAccessible()) { + log.debug("Project registry contains closed project {}", project); // this is actually a bug somewhere in registry refresh logic, closed projects should not be there continue; } try { - Artifact artifact = projectFacade.getMavenProject(monitor).getArtifact(); + ArtifactKey artifact = projectFacade.getArtifactKey(); IFile pomFile = projectFacade.getPom(); IPath location = pomFile.getLocation(); if(location != null) { File pom = location.toFile(); if(pom.canRead()) { - String key = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":pom:" + artifact.getBaseVersion(); //$NON-NLS-1$ //$NON-NLS-2$ + String key = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":pom:" + artifact.getVersion(); //$NON-NLS-1$ //$NON-NLS-2$ state.put(key, pom.getCanonicalPath()); } } IResource outputLocation = root.findMember(projectFacade.getOutputLocation()); - if(!"pom".equals(artifact.getType()) && outputLocation != null && outputLocation.exists()) { //$NON-NLS-1$ - String extension = artifact.getArtifactHandler().getExtension(); - String key = artifact.getGroupId() - + ":" + artifact.getArtifactId() + ":" + extension + ":" + artifact.getBaseVersion(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - state.put(key, outputLocation.getLocation().toFile().getCanonicalPath()); + if(!"pom".equals(projectFacade.getPackaging()) && outputLocation != null && outputLocation.exists()) { //$NON-NLS-1$ + // three cases to consider + // 1. facade has cached MavenProject instance, i.e. it was refreshed during this eclipse session + // 2. project has persistent PPROP_EXTENSION + // 3. neither cached MavenProject instance nor PPROP_EXTENSION are present + String extension; + MavenProject mavenProject = projectFacade.getMavenProject(); + if(mavenProject != null) { + extension = getAndPersistArtifactExtension(project, mavenProject); + } else { + extension = project.getPersistentProperty(PPROP_EXTENSION); + } + if(extension == null && mavenProject == null) { + // force loading of MavenProject + extension = getAndPersistArtifactExtension(project, projectFacade.getMavenProject(monitor)); + } + if(extension != null) { + String key = artifact.getGroupId() + + ":" + artifact.getArtifactId() + ":" + extension + ":" + artifact.getVersion(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + state.put(key, outputLocation.getLocation().toFile().getCanonicalPath()); + } else { + log.warn("Could not determine project {} main artifact extension.", project); + } } } catch(CoreException ex) { log.error("Error writing workspace state file", ex); @@ -93,4 +117,10 @@ public class WorkspaceStateWriter implements IMavenProjectChangedListener { log.error("Error writing workspace state file", ex); } } + + private String getAndPersistArtifactExtension(IProject project, MavenProject mavenProject) throws CoreException { + String extension = mavenProject.getArtifact().getArtifactHandler().getExtension(); + project.setPersistentProperty(PPROP_EXTENSION, extension); + return extension; + } } |