Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilos Kleint2010-12-21 10:24:15 +0000
committerMilos Kleint2010-12-21 10:24:15 +0000
commitef9d5db6837e30ce0c5e339bab85077856015896 (patch)
tree85cce9a82c82f31f736d1291461649f7a559c895
parent490b0af2b663515e80a38ae26ddc70fbc31554a8 (diff)
downloadm2e-core-ef9d5db6837e30ce0c5e339bab85077856015896.tar.gz
m2e-core-ef9d5db6837e30ce0c5e339bab85077856015896.tar.xz
m2e-core-ef9d5db6837e30ce0c5e339bab85077856015896.zip
MNGECLIPSE-2667, MNGECLIPSE-2540 have the effective MavenProject instance around for all local fs poms and also for poms coming from local repository. The value is cached in the SourceViewer instance to be available for all xml editin features during the lifetime of the editor. The effective MavenProject gets only updated for projects in workspace and only when the new MavenProject is valid (any failed steps in between are ignored and old value is used)
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/IMavenProjectCache.java29
-rw-r--r--org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java4
-rw-r--r--org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomTemplateContext.java7
-rw-r--r--org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XmlUtils.java22
-rw-r--r--org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java158
5 files changed, 185 insertions, 35 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/IMavenProjectCache.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/IMavenProjectCache.java
new file mode 100644
index 00000000..a62bd122
--- /dev/null
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/IMavenProjectCache.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.m2e.core.project;
+
+import org.apache.maven.project.MavenProject;
+
+/**
+ * interface implemented by maven pom's xml editor SourceViewer for storing and retrieving the latest valid
+ * MavenProject cached for various xml editor related features.
+ *
+ *
+ * Note: Added here in order not to introduce a dependency between editor and xml.editor projects. If that is not a problem,
+ * probably move to editor.
+ * @author mkleint
+ */
+public interface IMavenProjectCache {
+
+ void setMavenProject(MavenProject prj);
+
+ MavenProject getMavenProject();
+}
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java
index 5f3522a0..70ff4c0e 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomHyperlinkDetector.java
@@ -430,7 +430,7 @@ public class PomHyperlinkDetector implements IHyperlinkDetector {
final Fragment groupId = getValue(fragment, "<groupId>", "</groupId>"); //$NON-NLS-1$ //$NON-NLS-2$
final Fragment artifactId = getValue(fragment, "<artifactId>", Messages.PomHyperlinkDetector_23); //$NON-NLS-1$
final Fragment version = getValue(fragment, "<version>", "</version>"); //$NON-NLS-1$ //$NON-NLS-2$
- final IProject prj = XmlUtils.extractProject(viewer);
+ final MavenProject prj = XmlUtils.extractMavenProject(viewer);
IHyperlink pomHyperlink = new IHyperlink() {
public IRegion getHyperlinkRegion() {
@@ -465,7 +465,7 @@ public class PomHyperlinkDetector implements IHyperlinkDetector {
try {
//TODO how do we decide here if the hyperlink is a dependency or a plugin
// hyperlink??
- versionString = PomTemplateContext.extractVersion(prj, versionString, gridString, artidString, PomTemplateContext.EXTRACT_STRATEGY_DEPENDENCY);
+ versionString = PomTemplateContext.extractVersion(prj, null, versionString, gridString, artidString, PomTemplateContext.EXTRACT_STRATEGY_DEPENDENCY);
} catch(CoreException e) {
versionString = null;
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomTemplateContext.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomTemplateContext.java
index a1f4eb93..da0bdeff 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomTemplateContext.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/PomTemplateContext.java
@@ -614,6 +614,13 @@ public enum PomTemplateContext {
throws CoreException {
//interpolate the version found to get rid of expressions
MavenProject mp = XmlUtils.extractMavenProject(project);
+ return extractVersion(mp, project, version, groupId, artifactId, strategy);
+ }
+
+ static String extractVersion(MavenProject mp, IProject project, String version, String groupId, String artifactId, int strategy)
+ throws CoreException {
+
+ assert mp != null;
version = simpleInterpolate(mp, version);
if (version==null) {
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XmlUtils.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XmlUtils.java
index 315f0e1e..d1beb33d 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XmlUtils.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/XmlUtils.java
@@ -41,6 +41,7 @@ import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.internal.project.MavenMarkerManager;
+import org.eclipse.m2e.core.project.IMavenProjectCache;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
/**
*
@@ -71,6 +72,10 @@ public class XmlUtils {
*/
public static IProject extractProject(ITextViewer sourceViewer) {
ITextFileBuffer buf = FileBuffers.getTextFileBufferManager().getTextFileBuffer(sourceViewer.getDocument());
+ if (buf == null) {
+ //eg. for viewers of pom files in local repository
+ return null;
+ }
IFileStore folder = buf.getFileStore();
File file = new File(folder.toURI());
IPath path = Path.fromOSString(file.getAbsolutePath());
@@ -106,8 +111,23 @@ public class XmlUtils {
public static MavenProject extractMavenProject(ITextViewer sourceViewer) {
//TODO we might want to eventually reduce our dependency on IProject
+
+ //first try checking for latest mavenproject in the facade
+ //TODO is there a reliable way to check for other model's updates?
IProject prj = extractProject(sourceViewer);
- return extractMavenProject(prj);
+ MavenProject mp = extractMavenProject(prj);
+ if (mp == null) {
+ //if not found, look in the sourceViewer's cache
+ if (sourceViewer instanceof IMavenProjectCache) {
+ mp = ((IMavenProjectCache)sourceViewer).getMavenProject();
+ }
+ } else {
+ //if found, update the sourceViewer's cache
+ if (sourceViewer instanceof IMavenProjectCache) {
+ ((IMavenProjectCache)sourceViewer).setMavenProject(mp);
+ }
+ }
+ return mp;
}
public static MavenProject extractMavenProject(IProject project) {
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java
index 1b3167be..013ab7cf 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java
@@ -71,7 +71,10 @@ import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.actions.OpenPomAction;
import org.eclipse.m2e.core.actions.OpenPomAction.MavenPathStorageEditorInput;
import org.eclipse.m2e.core.actions.OpenPomAction.MavenStorageEditorInput;
import org.eclipse.m2e.core.actions.SelectionUtil;
@@ -79,6 +82,7 @@ import org.eclipse.m2e.core.core.IMavenConstants;
import org.eclipse.m2e.core.core.MavenLogger;
import org.eclipse.m2e.core.embedder.ArtifactKey;
import org.eclipse.m2e.core.embedder.MavenModelManager;
+import org.eclipse.m2e.core.project.IMavenProjectCache;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.MavenProjectManager;
import org.eclipse.m2e.core.util.Util;
@@ -91,6 +95,7 @@ import org.eclipse.m2e.model.edit.pom.util.PomResourceFactoryImpl;
import org.eclipse.m2e.model.edit.pom.util.PomResourceImpl;
import org.eclipse.search.ui.text.ISearchEditorAccess;
import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorInput;
@@ -99,6 +104,7 @@ import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IShowEditorInput;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IWindowListener;
@@ -120,6 +126,7 @@ import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSEAdapter;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.sonatype.aether.graph.DependencyNode;
@@ -399,36 +406,6 @@ public class MavenPomEditor extends FormEditor implements IResourceChangeListene
}
protected void addPages() {
- //attempt to preload the maven project to have the caches hot for various features that depend on
- // MavenProjectFacade.getMavenProject() to return an uptodate resolved maven model.
- // TODO: if there is a better way of accessing cached MavenProject/Model instances that also
- //works for non-project files as well, we should use it.
- if (getEditorInput() instanceof IFileEditorInput) {
- IFileEditorInput ei = (IFileEditorInput)getEditorInput();
- final IFile file = ei.getFile();
- IProject prj = file != null ? file.getProject() : null;
- //only if the project is the pom.xml file's own project..
- if (prj != null && IMavenConstants.POM_FILE_NAME.equals(file.getProjectRelativePath().toString())) {
- MavenProjectManager projectManager = MavenPlugin.getDefault().getMavenProjectManager();
- final IMavenProjectFacade mvnprj = projectManager.getProject(prj);
- if (mvnprj != null && mvnprj.getMavenProject() == null) {
- Job jb = new Job("load maven project") {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- try {
- mvnprj.getMavenProject(monitor);
- } catch(CoreException e) {
- //just ignore
- MavenLogger.log("Unable to read maven project. Some content assists might not work as advertized.", e); //$NON-NLS-1$
- }
- return Status.OK_STATUS;
- }
- };
- jb.setSystem(true);
- jb.schedule();
- }
- }
- }
showAdvancedTabsAction = new Action(Messages.MavenPomEditor_action_advanced, IAction.AS_RADIO_BUTTON) {
public void run() {
@@ -454,6 +431,75 @@ public class MavenPomEditor extends FormEditor implements IResourceChangeListene
addPomPage(dependencyTreePage);
addSourcePage();
+
+ //attempt to preload the maven project to have the caches hot for various features that depend on
+ // MavenProjectFacade.getMavenProject() to return an uptodate resolved maven model.
+ // TODO: if there is a better way of accessing cached MavenProject/Model instances that also
+ //works for non-project files as well, we should use it.
+ System.out.println("editor input=" + getEditorInput().getClass());
+
+ //this is handling for pom files that are from the local repository and are read-only..
+ if (getEditorInput() instanceof OpenPomAction.MavenPathStorageEditorInput) {
+ IPathEditorInput pi = (IPathEditorInput) getEditorInput();
+ final File file = pi.getPath().toFile();
+ Job jb = new Job("load maven project") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ MavenProject toCache = null;
+ try {
+ toCache = MavenPlugin.getDefault().getMaven().readProject(file, monitor);
+ } catch(CoreException e) {
+ MavenLogger.log("Unable to read maven project. Some content assists might not work as advertized.", e);
+ }
+ if (toCache != null) {
+ //store in sourceViewer
+ sourcePage.setInitialMavenProject(toCache);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ jb.setSystem(true);
+ jb.schedule();
+ }
+
+ //handling for pom files from the workspace and/or local filesystem
+ if(getEditorInput() instanceof IFileEditorInput) {
+ IFileEditorInput ei = (IFileEditorInput) getEditorInput();
+ final IFile file = ei.getFile();
+ Job jb = new Job("load maven project") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IProject prj = file != null ? file.getProject() : null;
+ MavenProject toCache = null;
+ MavenProjectManager projectManager = MavenPlugin.getDefault().getMavenProjectManager();
+ //only if the project is the pom.xml file's own project..
+ if(prj != null && IMavenConstants.POM_FILE_NAME.equals(file.getProjectRelativePath().toString())) {
+ IMavenProjectFacade mvnprj = projectManager.getProject(prj);
+ toCache = mvnprj != null ? mvnprj.getMavenProject() : null;
+ if(mvnprj != null && toCache == null) {
+ try {
+ toCache = mvnprj.getMavenProject(monitor);
+ } catch(CoreException e) {
+ //just ignore
+ MavenLogger.log("Unable to read maven project. Some content assists might not work as advertized.", e); //$NON-NLS-1$
+ }
+ }
+ } else {
+ IMavenProjectFacade mvnprj = projectManager.create(file, true, monitor);
+ toCache = mvnprj != null ? mvnprj.getMavenProject() : null;
+ }
+ if (toCache != null) {
+ //store in sourceViewer
+ sourcePage.setInitialMavenProject(toCache);
+ }
+ return Status.OK_STATUS;
+
+ }
+ };
+ jb.setSystem(true);
+ jb.schedule();
+ }
+
showAdvancedPages();
@@ -473,8 +519,6 @@ public class MavenPomEditor extends FormEditor implements IResourceChangeListene
if(EFFECTIVE_POM.equals(name)){
loadEffectivePOM();
}
- if (POM_XML.equals(name)) {
- }
//The editor occassionally doesn't get
//closed if the project gets deleted. In this case, the editor
//stays open and very bad things happen if you select it
@@ -662,9 +706,31 @@ public class MavenPomEditor extends FormEditor implements IResourceChangeListene
LoadEffectivePomJob job = new LoadEffectivePomJob(Messages.MavenPomEditor_loading);
job.schedule();
}
+
+ protected class MavenStructuredTextViewer extends StructuredTextViewer implements IMavenProjectCache {
+
+ private MavenProject project;
+ public MavenStructuredTextViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
+ boolean showAnnotationsOverview, int styles) {
+ super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles);
+ }
+
+ public void setMavenProject(MavenProject prj) {
+ project = prj;
+
+ }
+
+ public MavenProject getMavenProject() {
+ return project;
+ }
+
+
+ }
protected class StructuredSourceTextEditor extends StructuredTextEditor {
private long fModificationStamp = -1;
+ private MavenProject mvnprj;
+ private final Object LOCK = new Object();
protected void updateModificationStamp() {
IDocumentProvider p= getDocumentProvider();
@@ -675,6 +741,34 @@ public class MavenPomEditor extends FormEditor implements IResourceChangeListene
fModificationStamp= p.getModificationStamp(getEditorInput());
}
}
+
+ void setInitialMavenProject(MavenProject prj) {
+ synchronized(LOCK) {
+ if(getSourceViewer() != null && getSourceViewer() instanceof IMavenProjectCache) {
+ IMavenProjectCache cache = (IMavenProjectCache) getSourceViewer();
+ cache.setMavenProject(prj);
+ } else {
+ mvnprj = prj;
+ }
+ }
+ }
+
+ /**
+ * we override the creation of StructuredTextViewer to have our own subclass created
+ * that drags along an instance of resolved MavenProject via implementing IMavenProjectCache
+ *
+ */
+ protected StructuredTextViewer createStructedTextViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
+ MavenStructuredTextViewer toRet = new MavenStructuredTextViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles);
+ synchronized(LOCK) {
+ if(mvnprj != null) {
+ toRet.setMavenProject(mvnprj);
+ mvnprj = null;
+ }
+ }
+ return toRet;
+ }
+
protected void sanityCheckState(IEditorInput input) {
IDocumentProvider p= getDocumentProvider();

Back to the top