This is an automated email from the ASF dual-hosted git repository.

johnmcdonnell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new cb1c221  [NETBEANS-290] Provided support for hyperlink on 
dependencies. (#481)
cb1c221 is described below

commit cb1c221ac80ac201eb2e483dd55964560fc2c694
Author: John McDonnell <mcdonnell.j...@gmail.com>
AuthorDate: Tue Jun 26 21:28:12 2018 +0100

    [NETBEANS-290] Provided support for hyperlink on dependencies. (#481)
    
    * [NETBEANS-290] Provided support for hyperlink on dependencies.
---
 .../maven/hyperlinks/HyperlinkProviderImpl.java    | 668 ++++++++++++---------
 .../unit/data/test_projects/hyperlinks/pom.xml     |  48 ++
 .../unit/data/test_projects/hyperlinks2/pom.xml    |  19 +
 .../test_projects/hyperlinks2/subModule/pom.xml    |  16 +
 ...perlinkProviderImplTestForMultiPomProjects.java | 161 +++++
 ...erlinkProviderImplTestForSinglePomProjects.java | 285 +++++++++
 6 files changed, 917 insertions(+), 280 deletions(-)

diff --git 
a/maven.grammar/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImpl.java
 
b/maven.grammar/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImpl.java
index 1ed9be3..279a45c 100644
--- 
a/maven.grammar/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImpl.java
+++ 
b/maven.grammar/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImpl.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.netbeans.modules.maven.hyperlinks;
 
+import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Collections;
@@ -26,8 +26,10 @@ import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.text.Document;
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.InputLocation;
 import org.apache.maven.model.InputSource;
+import org.apache.maven.project.MavenProject;
 import 
org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
 import org.netbeans.api.editor.mimelookup.MimeRegistration;
 import org.netbeans.api.editor.mimelookup.MimeRegistrations;
@@ -46,6 +48,8 @@ import org.netbeans.modules.maven.api.FileUtilities;
 import org.netbeans.modules.maven.api.ModelUtils;
 import org.netbeans.modules.maven.api.NbMavenProject;
 import org.netbeans.modules.maven.api.PluginPropertyUtils;
+import org.netbeans.modules.maven.embedder.EmbedderFactory;
+import org.netbeans.modules.maven.embedder.MavenEmbedder;
 import org.netbeans.modules.maven.grammar.POMDataObject;
 import org.openide.awt.HtmlBrowser;
 import org.openide.cookies.EditCookie;
@@ -57,311 +61,71 @@ import org.openide.text.Line;
 import org.openide.util.NbBundle.Messages;
 import static org.netbeans.modules.maven.hyperlinks.Bundle.*;
 import org.netbeans.modules.maven.spi.nodes.NodeUtils;
+import org.openide.filesystems.FileUtil;
 
 /**
  * adds hyperlinking support to pom.xml files..
+ *
  * @author mkleint
  */
 @MimeRegistrations({
-    @MimeRegistration(mimeType=Constants.POM_MIME_TYPE, 
service=HyperlinkProviderExt.class, position = 1000),
-    @MimeRegistration(mimeType=POMDataObject.SETTINGS_MIME_TYPE, 
service=HyperlinkProviderExt.class, position = 1000)
+    @MimeRegistration(mimeType = Constants.POM_MIME_TYPE, service = 
HyperlinkProviderExt.class, position = 1000)
+    ,
+    @MimeRegistration(mimeType = POMDataObject.SETTINGS_MIME_TYPE, service = 
HyperlinkProviderExt.class, position = 1000)
 })
 public class HyperlinkProviderImpl implements HyperlinkProviderExt {
+
     private static final Logger LOG = 
Logger.getLogger(HyperlinkProviderImpl.class.getName());
-    
+
     @Override
     public boolean isHyperlinkPoint(final Document doc, final int offset, 
HyperlinkType type) {
-        final boolean[] isText = new boolean[1];
-        final int[] ftokenOff = new int[1];
-        final String[] ftext = new String[1];
-        doc.render(new Runnable() {
-
-            @Override
-            public void run() {
-                isText[0] = false;
-                TokenHierarchy th = TokenHierarchy.get(doc);
-                TokenSequence<XMLTokenId> xml = 
th.tokenSequence(XMLTokenId.language());
-                xml.move(offset);
-                xml.moveNext();
-                Token<XMLTokenId> token = xml.token();
+        final PomHyperlinkInfo hyperLinkInfo = new PomHyperlinkInfo(doc, 
offset);
+        doc.render(new PomParserRunnable(hyperLinkInfo, doc, offset));
 
-                // when it's not a value -> do nothing.
-                if (token == null) {
-                   
-                    return;
-                }
-                if (token.id() == XMLTokenId.TEXT) {
-                    isText[0] = true;
-                    ftokenOff[0] = xml.offset();
-                    ftext[0] = token.text().toString();
-                }
-            }
-        });
-           
-        if (isText[0]) {
-            //we are in element text
-            FileObject fo = getProjectDir(doc);
-            String text = ftext[0];
-            int tokenOff = ftokenOff[0];
-            if (fo != null && getPath(fo, text) != null) {
-                return true;
-            }
-            // urls get opened..
-            if (text != null &&
-                    (text.startsWith("http://";) || //NOI18N
-                    (text.startsWith("https://";)))) { //NOI18N
-                return true;
-            }
-            if (text != null) {
-                int ff = offset - tokenOff;
-                if (ff > -1 && ff < text.length()) {
-                    String before = text.substring(0, ff);
-                    String after = text.substring(ff, text.length());
-                    int bo = before.lastIndexOf("${");//NOI18N
-                    int bc = before.lastIndexOf("}");//NOI18N
-                    int ao = after.indexOf("${");//NOI18N
-                    int ac = after.indexOf("}");//NOI18N
-                    if (bo > bc && ac > -1 && (ac < ao || ao == -1)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
+        return hyperLinkInfo.isHyperlinkPoint();
     }
 
     @Override
     public int[] getHyperlinkSpan(final Document doc, final int offset, 
HyperlinkType type) {
-        final boolean[] isText = new boolean[1];
-        final int[] ftokenOff = new int[1];
-        final String[] ftext = new String[1];
-        
-        doc.render(new Runnable() {
-
-            @Override
-            public void run() {
-                isText[0] = false;
-                TokenHierarchy th = TokenHierarchy.get(doc);
-                TokenSequence<XMLTokenId> xml = 
th.tokenSequence(XMLTokenId.language());
-                xml.move(offset);
-                xml.moveNext();
-                Token<XMLTokenId> token = xml.token();
+        final PomHyperlinkInfo hyperLinkInfo = new PomHyperlinkInfo(doc, 
offset);
+        doc.render(new PomParserRunnable(hyperLinkInfo, doc, offset));
 
-                // when it's not a value -> do nothing.
-                if (token == null) {
-                   
-                    return;
-                }
-                if (token.id() == XMLTokenId.TEXT) {
-                    isText[0] = true;
-                    ftokenOff[0] = xml.offset();
-                    ftext[0] = token.text().toString();
-                }
-            }
-        });
-               
-        if (isText[0]) {
-            //we are in element text
-            FileObject fo = getProjectDir(doc);
-            int tokenOff = ftokenOff[0];
-            String text = ftext[0];
-            if (fo != null && getPath(fo, text) != null) {
-                return new int[] { tokenOff, tokenOff + text.length() };
-            }
-            // urls get opened..
-            if (text != null &&
-                    (text.startsWith("http://";) || //NOI18N
-                    (text.startsWith("https://";)))) { //NOI18N
-                return new int[] { tokenOff, tokenOff + text.length() };
-            }
-            if (text != null) {
-                Tuple prop = findProperty(text, tokenOff, offset);
-                if (prop != null) {
-                    return new int[] { prop.spanStart, prop.spanEnd};
-                }
-            }            
-        }
-        return null;
+        return hyperLinkInfo.getHyperLinkSpan();
     }
 
     @Override
     public void performClickAction(final Document doc, final int offset, 
HyperlinkType type) {
-        final boolean[] isText = new boolean[1];
-        final int[] ftokenOff = new int[1];
-        final String[] ftext = new String[1];
-        final FileObject fo = getProjectDir(doc);
-        doc.render(new Runnable() {
-
-            @Override
-            public void run() {
-                isText[0] = false;
-                TokenHierarchy th = TokenHierarchy.get(doc);
-                TokenSequence<XMLTokenId> xml = 
th.tokenSequence(XMLTokenId.language());
-                xml.move(offset);
-                xml.moveNext();
-                Token<XMLTokenId> token = xml.token();
-
-                // when it's not a value -> do nothing.
-                if (token == null) {
-                   
-                    return;
-                }
-                if (token.id() == XMLTokenId.TEXT) {
-                    isText[0] = true;
-                    ftokenOff[0] = xml.offset();
-                    ftext[0] = token.text().toString();
-                    if (fo != null && getPath(fo, ftext[0]) != null) {
-                        xml.movePrevious();
-                        token = xml.token();
-                        if (token != null && token.id().equals(XMLTokenId.TAG) 
&& TokenUtilities.equals(token.text(), ">")) {//NOI18N
-                            xml.movePrevious();
-                            token = xml.token();
-                            if (token != null && 
token.id().equals(XMLTokenId.TAG) && TokenUtilities.equals(token.text(), 
"<module")) {//NOI18N
-                                if (!ftext[0].endsWith("/pom.xml")) {
-                                    ftext[0] = ftext[0] + "/pom.xml"; //NOI18N
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        });
-
-        if (isText[0]) {
-            //we are in element text
-            int tokenOff = ftokenOff[0];
-            String text = ftext[0];
-            
-            if (fo != null && getPath(fo, text) != null) {
-                FileObject file = getPath(fo, text);
-                NodeUtils.openPomFile(file);
-            }
-            // urls get opened..
-            if (text != null &&
-                    (text.startsWith("http://";) || //NOI18N
-                    (text.startsWith("https://";)))) { //NOI18N
-                try {
-                    String urlText = text;
-                    if (urlText.contains("${")) {//NOI18N
-                        //special case, need to evaluate expression
-                        Project nbprj = getProject(doc);
-                        if (nbprj != null) {
-                            Object exRes;
-                            try {
-                                exRes = 
PluginPropertyUtils.createEvaluator(nbprj).evaluate(urlText);
-                                if (exRes != null) {
-                                    urlText = exRes.toString();
-                                }
-                            } catch (ExpressionEvaluationException ex) {
-                                //just ignore
-                                LOG.log(Level.FINE, "Expression evaluation 
failed", ex);
-                            }
+        final PomHyperlinkInfo hyperLinkInfo = new PomHyperlinkInfo(doc, 
offset);
+        doc.render(new PomParserRunnable(hyperLinkInfo, doc, offset));
 
-                        }
-                    }
-                    URL url = new URL(urlText);
-                    HtmlBrowser.URLDisplayer.getDefault().showURL(url);
-                } catch (MalformedURLException ex) {
-                    LOG.log(Level.FINE, "malformed url for hyperlink", ex);
-                }
-            }
-            else if (text != null) {
-                Tuple tup = findProperty(text, tokenOff, offset);
-                if (tup != null) {
-                    String prop = tup.value.substring("${".length(), 
tup.value.length() - 1); //remove the brackets//NOI18N
-                    NbMavenProject nbprj = getNbMavenProject(doc);
-                    if (nbprj != null) {
-                        if (prop != null && (prop.startsWith("project.") || 
prop.startsWith("pom."))) {//NOI18N
-                            String val = prop.substring(prop.indexOf('.') + 1, 
prop.length());//NOI18N
-                            //TODO eventually we want to process everything 
through an evaluation engine..
-                            InputLocation iloc = 
nbprj.getMavenProject().getModel().getLocation(val);
-                            if (iloc != null) {
-                                ModelUtils.openAtSource(iloc);
-                                return;
-                            }
-                        }
-                        InputLocation propLoc = 
nbprj.getMavenProject().getModel().getLocation("properties");
-                        if (propLoc != null) { //#212984
-                            InputLocation location = propLoc.getLocation(prop);
-                            if (location != null) {
-                                ModelUtils.openAtSource(location);
-                            }
-                        }
-                    }
-                }
-            }
-        }
+        hyperLinkInfo.performClickAction();
     }
-    
+
     @Override
     public Set<HyperlinkType> getSupportedHyperlinkTypes() {
         return Collections.singleton(HyperlinkType.GO_TO_DECLARATION);
     }
 
-
     @Override
     @Messages({
         "# {0} - property name",
-        "# {1} - resolved value", 
-        "Hint_prop_resolution={0} resolves to ''{1}''\nNavigate to 
definition.", 
+        "# {1} - resolved value",
+        "Hint_prop_resolution={0} resolves to ''{1}''\nNavigate to 
definition.",
         "Hint_prop_cannot=Cannot resolve expression\nNavigates to 
definition."})
     public String getTooltipText(final Document doc, final int offset, 
HyperlinkType type) {
+        final PomHyperlinkInfo hyperLinkInfo = new PomHyperlinkInfo(doc, 
offset);
+        doc.render(new PomParserRunnable(hyperLinkInfo, doc, offset));
+        String[] tooltip = hyperLinkInfo.getTooltipText();
 
-        final boolean[] isText = new boolean[1];
-        final int[] ftokenOff = new int[1];
-        final String[] ftext = new String[1];
-        
-        doc.render(new Runnable() {
-
-            @Override
-            public void run() {
-                isText[0] = false;
-                TokenHierarchy th = TokenHierarchy.get(doc);
-                TokenSequence<XMLTokenId> xml = 
th.tokenSequence(XMLTokenId.language());
-                xml.move(offset);
-                xml.moveNext();
-                Token<XMLTokenId> token = xml.token();
-
-                // when it's not a value -> do nothing.
-                if (token == null) {
-                   
-                    return;
-                }
-                if (token.id() == XMLTokenId.TEXT) {
-                    isText[0] = true;
-                    ftokenOff[0] = xml.offset();
-                    ftext[0] = token.text().toString();
-                }
-            }
-        });
- 
-        if (isText[0]) {
-            //we are in element text
-            String text = ftext[0];
-            int tokenOff = ftokenOff[0];
-            Tuple tup = findProperty(text, tokenOff, offset);
-
-            if (tup != null) {
-               String prop = tup.value.substring("${".length(), 
tup.value.length() - 1); //remove the brackets
-                try {
-                    Project nbprj = getProject(doc);
-                    if (nbprj != null) {
-                        Object exRes = 
PluginPropertyUtils.createEvaluator(nbprj).evaluate(tup.value);
-                        if (exRes != null) {
-                            return Hint_prop_resolution(prop, exRes);
-                        } else {
-                        }
-                    } else {
-                        //pom file in repository or settings file.
-                    }
-                } catch (ExpressionEvaluationException ex) {
-                    return Hint_prop_cannot();
-                }
-            }  
+        if (tooltip == null) {
+            return Hint_prop_cannot();
+        } else if (tooltip.length == 2) {
+            return Hint_prop_resolution(tooltip[0], tooltip[1]);
+        } else {
+            return tooltip[0];
         }
-        return null;
     }
-    
+
     public static void openAtSource(InputLocation location) {
         InputSource source = location.getSource();
         if (source != null && source.getLocation() != null) {
@@ -381,19 +145,20 @@ public class HyperlinkProviderImpl implements 
HyperlinkProviderExt {
             }
         }
     }
-    
+
     private static class Tuple {
+
         final int spanStart;
         final int spanEnd;
         final String value;
+
         public Tuple(String val, int start, int end) {
             this.value = val;
             this.spanStart = start;
-            this.spanEnd = end; 
+            this.spanEnd = end;
         }
-    } 
-    
-    
+    }
+
     private Tuple findProperty(String textToken, int tokenOffset, int 
currentOffset) {
         if (textToken == null) {
             return null;
@@ -410,15 +175,15 @@ public class HyperlinkProviderImpl implements 
HyperlinkProviderExt {
             if (bo > bc && ac > -1 && (ac < ao || ao == -1)) { //case where 
currentOffset is on property
                 return new Tuple(textToken.substring(bo, before.length() + ac 
+ 1), tokenOffset + bo, tokenOffset + ff + ac + 1);
             }
-         
+
             if (before.length() == 0 && ao == 0 && ac > 0) { //case where 
currentOffset is at beginning
-                return new Tuple(textToken.substring(0, ac + 1), tokenOffset, 
tokenOffset +  ac + 1);
+                return new Tuple(textToken.substring(0, ac + 1), tokenOffset, 
tokenOffset + ac + 1);
             }
-            
+
         }
         return null;
     }
-    
+
     private FileObject getProjectDir(Document doc) {
         DataObject dObject = NbEditorUtilities.getDataObject(doc);
         if (dObject != null) {
@@ -426,7 +191,7 @@ public class HyperlinkProviderImpl implements 
HyperlinkProviderExt {
         }
         return null;
     }
-    
+
     private NbMavenProject getNbMavenProject(Document doc) {
         Project prj = getProject(doc);
         if (prj != null) {
@@ -442,6 +207,7 @@ public class HyperlinkProviderImpl implements 
HyperlinkProviderExt {
         }
         return null;
     }
+
     private FileObject getPath(FileObject parent, String path) {
         // TODO more substitutions necessary probably..
         if (path.startsWith("${basedir}/")) { //NOI18N
@@ -454,4 +220,346 @@ public class HyperlinkProviderImpl implements 
HyperlinkProviderExt {
         return parent.getFileObject(path);
     }
 
+    private class PomParserRunnable implements Runnable {
+
+        private final PomHyperlinkInfo hyperLinkInfo;
+        private final Document document;
+        private final int offset;
+
+        public PomParserRunnable(PomHyperlinkInfo hyperLinkInfo, Document 
document, int offset) {
+            this.hyperLinkInfo = hyperLinkInfo;
+            this.document = document;
+            this.offset = offset;
+        }
+
+        @Override
+        public void run() {
+            TokenHierarchy th = TokenHierarchy.get(document);
+            TokenSequence<XMLTokenId> xml = 
th.tokenSequence(XMLTokenId.language());
+            xml.move(offset);
+            xml.moveNext();
+            Token<XMLTokenId> token = xml.token();
+
+            // when it's not a value -> do nothing.
+            if (token == null) {
+                return;
+            }
+
+            if (token.id() == XMLTokenId.TEXT) {
+                hyperLinkInfo.calculateInfo(token, xml);
+            }
+        }
+    }
+
+    private class PomHyperlinkInfo {
+
+        final Document doc;
+        final int documentOffset;
+        final FileObject projectFileObject;
+        boolean isText;
+        int ftokenOff;
+        String ftext;
+
+        String artifactId;
+        String groupId;
+        String version;
+        String type;
+
+        public PomHyperlinkInfo(Document doc, int documentOffset) {
+            this.doc = doc;
+            this.documentOffset = documentOffset;
+            this.projectFileObject = getProjectDir(doc);
+        }
+
+        boolean isHyperlinkUrl() {
+            return ftext != null
+                    && (ftext.startsWith("http://";)
+                    || //NOI18N
+                    ftext.startsWith("https://";)); //NOI18N;
+        }
+
+        private FileObject getFileSystemLinkObject() {
+            FileObject fo = getProjectDir(doc);
+            if (fo != null && ftext != null) {
+                return getPath(fo, ftext) ;
+            }
+            return null;
+        }
+
+        boolean isMavenProperty() {
+            if (ftext != null) {
+                int ff = documentOffset - ftokenOff;
+                if (ff > -1 && ff < ftext.length()) {
+                    String before = ftext.substring(0, ff);
+                    String after = ftext.substring(ff, ftext.length());
+                    int bo = before.lastIndexOf("${");//NOI18N
+                    int bc = before.lastIndexOf("}");//NOI18N
+                    int ao = after.indexOf("${");//NOI18N
+                    int ac = after.indexOf("}");//NOI18N
+                    if (bo > bc && ac > -1 && (ac < ao || ao == -1)) {
+                        return true;
+                    }
+                }
+            }
+            return false;
+        }
+
+        boolean isMavenDependency() {
+            return artifactId != null && groupId != null && version != null;
+        }
+
+        boolean isHyperlinkPoint() {
+            return (isHyperlinkUrl() || getFileSystemLinkObject() != null || 
+                    isMavenProperty() || (isMavenDependency() && 
getMavenArtifactAbsolutePomPath() != null));
+        }
+
+        private void calculateInfo(Token<XMLTokenId> token, 
TokenSequence<XMLTokenId> xml) {
+            isText = token.id() == XMLTokenId.TEXT;
+            if (isText) {
+                ftokenOff = xml.offset();
+                ftext = token.text().toString();
+
+                if (projectFileObject != null && getPath(projectFileObject, 
ftext) != null) {
+                    xml.movePrevious();
+                    token = xml.token();
+                    if (token != null && token.id().equals(XMLTokenId.TAG) && 
TokenUtilities.equals(token.text(), ">")) {//NOI18N
+                        xml.movePrevious();
+                        token = xml.token();
+                        if (token != null && 
token.id().equals(XMLTokenId.TAG)) {
+                            if (TokenUtilities.equals(token.text(), 
"<module")) {//NOI18N
+                                if (!ftext.endsWith("/pom.xml")) {
+                                    ftext += "/pom.xml"; //NOI18N
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    xml.movePrevious();
+                    token = xml.token();
+                    if (token != null && token.id().equals(XMLTokenId.TAG) && 
TokenUtilities.equals(token.text(), ">")) { //NOI18N
+                        xml.movePrevious();
+                        String tokenString = xml.token().text().toString();
+                        if ("<artifactId".equals(tokenString) || //NOI18N
+                                "<groupId".equals(tokenString) || //NOI18N
+                                "<type".equals(tokenString) || //NOI18N
+                                ("<version".equals(tokenString) && 
!ftext.startsWith("${"))) { 
+                            
+                            resetSequenceToDependencytagToken(xml);
+                            
+                            if (TokenUtilities.equals(xml.token().text(), 
"<dependency")) {          //NOI18N
+                                
+                                while 
(!TokenUtilities.equals(xml.token().text(), "</dependency")) { //NOI18N
+                                    
+                                    switch (xml.token().text().toString()) {
+                                        case "<artifactId":
+                                            moveToXmlTokenById(xml, 
XMLTokenId.TEXT);
+                                            token = xml.token();
+                                            artifactId = 
token.text().toString();
+                                            break;
+                                        case "<groupId":
+                                            moveToXmlTokenById(xml, 
XMLTokenId.TEXT);
+                                            token = xml.token();
+                                            groupId = token.text().toString();
+                                            break;
+                                        case "<version":
+                                            moveToXmlTokenById(xml, 
XMLTokenId.TEXT);
+                                            token = xml.token();
+                                            if 
(TokenUtilities.startsWith(token.text(), "${")) { //NOI18N
+                                                Project nbprj = 
getProject(doc);
+                                                if (nbprj != null) {
+                                                    try {
+                                                        version = (String) 
PluginPropertyUtils.createEvaluator(nbprj).evaluate(token.text().toString());
+                                                    } catch 
(ExpressionEvaluationException eee) {
+                                                        LOG.log(Level.INFO, 
"Unable to evaluate property: " + token.text().toString(), eee);
+                                                    }
+                                                }
+                                            } else {
+                                                version = 
token.text().toString();
+                                            }
+                                            break;
+                                        case "<type" :
+                                            moveToXmlTokenById(xml, 
XMLTokenId.TEXT);
+                                            token = xml.token();
+                                            type = token.text().toString();
+                                            break;
+                                    }
+                                    xml.moveNext();
+                                    moveToXmlTokenById(xml, XMLTokenId.TAG);
+                                }
+                                // handle cases where the version element is 
covered in a 
+                                // parent pom/dependenciesManagement
+                                if (version == null) {
+                                    NbMavenProject projectForDocument = 
getNbMavenProject(doc);
+                                    if (projectForDocument != null) {
+                                        MavenProject mavenProject = 
projectForDocument.getMavenProject();
+                                        for (Artifact artifact : 
mavenProject.getArtifacts()) {
+                                            if 
(artifact.getGroupId().equals(groupId)
+                                                    && 
artifact.getArtifactId().equals(artifactId)) {
+                                                version = 
artifact.getVersion();
+                                                break;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        String[] getTooltipText() {
+            if (isText) {
+                //we are in element text
+                String text = ftext;
+                int tokenOff = ftokenOff;
+                if (isMavenProperty()) {
+                    Tuple tup = findProperty(text, tokenOff, documentOffset);
+
+                    if (tup != null) {
+                        String prop = tup.value.substring("${".length(), 
tup.value.length() - 1); //remove the brackets
+                        try {
+                            Project nbprj = getProject(doc);
+                            if (nbprj != null) {
+                                Object exRes = 
PluginPropertyUtils.createEvaluator(nbprj).evaluate(tup.value);
+                                if (exRes != null) {
+                                    return new String[]{prop, (String) exRes};
+                                }
+                            } else {
+                                //pom file in repository or settings file.
+                            }
+                        } catch (ExpressionEvaluationException ex) {
+                            return null;
+                        }
+                    }
+                } else if (isMavenDependency()) {
+                    return new String[]{getMavenArtifactAbsolutePomPath()};
+                }
+            }
+            return null;
+        }
+
+        String getMavenArtifactAbsolutePomPath() {
+            if (!isMavenDependency()) {
+                return null;
+            } else {
+                MavenEmbedder embedder = EmbedderFactory.getProjectEmbedder();
+                Artifact mavenArtifact = embedder.createArtifact(groupId, 
artifactId, version, type == null ? "jar" : type);
+                String mavenPomPath = 
embedder.getLocalRepository().find(mavenArtifact).getFile().getAbsolutePath().replace(".jar",
 ".pom");
+                if (mavenPomPath == null) {
+                    return null;
+                }
+                return new File(mavenPomPath).exists() ? mavenPomPath : null;
+            }
+        }
+
+        private int[] getHyperLinkSpan() {
+            if (isText) {
+                //we are in element text
+                FileObject fo = getProjectDir(doc);
+                if (fo != null && getPath(fo, ftext) != null) {
+                    return new int[]{ftokenOff, ftokenOff + ftext.length()};
+                }
+                // urls get opened..
+                if (isHyperlinkUrl()) {
+                    return new int[]{ftokenOff, ftokenOff + ftext.length()};
+                }
+                if (ftext != null) {
+                    Tuple prop = findProperty(ftext, ftokenOff, 
documentOffset);
+                    if (prop != null) {
+                        return new int[]{prop.spanStart, prop.spanEnd};
+                    }
+                }
+                if (isMavenDependency()) {
+                    return new int[]{ftokenOff, ftokenOff + ftext.length()};
+                }
+            }
+            return null;
+        }
+
+        private void 
resetSequenceToDependencytagToken(TokenSequence<XMLTokenId> xml) {
+            while (!TokenUtilities.equals("<dependency", xml.token().text())   
          //NOI18N
+                    && !TokenUtilities.equals("<plugin", xml.token().text())   
          //NOI18N
+                    && !TokenUtilities.equals("<parent", xml.token().text())   
          //NOI18N
+                    && !TokenUtilities.equals("<exclusion", 
xml.token().text())             //NOI18N
+                    && !TokenUtilities.equals("<project", xml.token().text())) 
{         //NOI18N
+                xml.movePrevious();
+            }
+        }
+
+        private void performClickAction() {
+            if (isText) {
+                //we are in element text
+                int tokenOff = ftokenOff;
+                String text = ftext;
+                FileObject fileSystemLinkObject = getFileSystemLinkObject();
+                if (fileSystemLinkObject != null) {
+                    NodeUtils.openPomFile(fileSystemLinkObject);
+                } else if (isHyperlinkUrl()) {
+                    // urls get opened..
+                    try {
+                        String urlText = text;
+                        if (urlText.contains("${")) {//NOI18N
+                            //special case, need to evaluate expression
+                            Project nbprj = getProject(doc);
+                            if (nbprj != null) {
+                                Object exRes;
+                                try {
+                                    exRes = 
PluginPropertyUtils.createEvaluator(nbprj).evaluate(urlText);
+                                    if (exRes != null) {
+                                        urlText = exRes.toString();
+                                    }
+                                } catch (ExpressionEvaluationException ex) {
+                                    //just ignore
+                                    LOG.log(Level.FINE, "Expression evaluation 
failed", ex);
+                                }
+
+                            }
+                        }
+                        URL url = new URL(urlText);
+                        HtmlBrowser.URLDisplayer.getDefault().showURL(url);
+                    } catch (MalformedURLException ex) {
+                        LOG.log(Level.FINE, "malformed url for hyperlink", ex);
+                    }
+                } else if (isMavenProperty()) {
+                    Tuple tup = findProperty(text, tokenOff, documentOffset);
+                    if (tup != null) {
+                        String prop = tup.value.substring(2, 
tup.value.length() - 1);
+                        NbMavenProject nbprj = getNbMavenProject(doc);
+                        if (nbprj != null) {
+                            if (prop != null && (prop.startsWith("project.") 
|| prop.startsWith("pom."))) {//NOI18N
+                                String val = prop.substring(prop.indexOf('.') 
+ 1, prop.length());//NOI18N
+                                //TODO eventually we want to process 
everything through an evaluation engine..
+                                InputLocation iloc = 
nbprj.getMavenProject().getModel().getLocation(val);
+                                if (iloc != null) {
+                                    ModelUtils.openAtSource(iloc);
+                                    return;
+                                }
+                            }
+                            InputLocation propLoc = 
nbprj.getMavenProject().getModel().getLocation("properties");
+                            if (propLoc != null) { //#212984
+                                InputLocation location = 
propLoc.getLocation(prop);
+                                if (location != null) {
+                                    ModelUtils.openAtSource(location);
+                                }
+                            }
+                        }
+                    }
+                } else if (isMavenDependency()) {
+                    File pomFile = new File(getMavenArtifactAbsolutePomPath());
+                    FileObject fileToOpen = FileUtil.toFileObject(pomFile);
+                    if (fileToOpen != null) {
+                        NodeUtils.openPomFile(fileToOpen);
+                    }
+                }
+            }
+        }
+
+        private void moveToXmlTokenById(TokenSequence<XMLTokenId> xml, 
XMLTokenId tokenId) {
+            while (xml.token() != null && !xml.token().id().equals(tokenId)) {
+                xml.moveNext();
+            }
+        }
+
+    }
 }
diff --git a/maven.grammar/test/unit/data/test_projects/hyperlinks/pom.xml 
b/maven.grammar/test/unit/data/test_projects/hyperlinks/pom.xml
new file mode 100644
index 0000000..bf4ffd8
--- /dev/null
+++ b/maven.grammar/test/unit/data/test_projects/hyperlinks/pom.xml
@@ -0,0 +1,48 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.netbeans</groupId>
+    <artifactId>hyperlinks</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <properties>
+        <mockito.version>1.10.9</mockito.version>
+    </properties>
+    <repositories>
+        <repository>
+            <id>central</id>
+            <name>Central Repository</name>
+            <url>http://repo.maven.apache.org/maven2</url>
+            <layout>default</layout>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${mockito.version}</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <groupId>org.apache.maven.plugins</groupId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <compilerArgs>
+                        <arg>-parameters</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/maven.grammar/test/unit/data/test_projects/hyperlinks2/pom.xml 
b/maven.grammar/test/unit/data/test_projects/hyperlinks2/pom.xml
new file mode 100644
index 0000000..6e56bc8
--- /dev/null
+++ b/maven.grammar/test/unit/data/test_projects/hyperlinks2/pom.xml
@@ -0,0 +1,19 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.netbeans</groupId>
+    <artifactId>hyperlinks2</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <modules>
+        <module>subModule</module>
+    </modules>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>3.7</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+</project>
\ No newline at end of file
diff --git 
a/maven.grammar/test/unit/data/test_projects/hyperlinks2/subModule/pom.xml 
b/maven.grammar/test/unit/data/test_projects/hyperlinks2/subModule/pom.xml
new file mode 100644
index 0000000..1f9350d
--- /dev/null
+++ b/maven.grammar/test/unit/data/test_projects/hyperlinks2/subModule/pom.xml
@@ -0,0 +1,16 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.netbeans</groupId>
+        <artifactId>hyperlinks2</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>subModule</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git 
a/maven.grammar/test/unit/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImplTestForMultiPomProjects.java
 
b/maven.grammar/test/unit/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImplTestForMultiPomProjects.java
new file mode 100644
index 0000000..9916ec5
--- /dev/null
+++ 
b/maven.grammar/test/unit/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImplTestForMultiPomProjects.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.netbeans.modules.maven.hyperlinks;
+
+import java.io.File;
+import java.io.IOException;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.netbeans.api.lexer.Language;
+import org.netbeans.api.xml.lexer.XMLTokenId;
+import org.netbeans.junit.NbTestCase;
+import org.netbeans.lib.editor.hyperlink.spi.HyperlinkType;
+import org.netbeans.modules.maven.grammar.POMDataObject;
+import org.openide.cookies.EditorCookie;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.LocalFileSystem;
+import org.openide.loaders.DataObject;
+
+/**
+ * Additional Unit tests for the HyperlinkProvider for pom.xml files when used 
in a 
+ * hierarchy of maven projects.
+ */
+public class HyperlinkProviderImplTestForMultiPomProjects extends NbTestCase {
+    
+    private static final int START_DEPENDENCY_GROUP_ID_VALUE = 538;
+    private static final int MIDDLE_DEPENDENCY_GROUP_ID_VALUE = 547;
+    private static final int END_DEPENDENCY_GROUP_ID_VALUE = 555;
+    
+    private static final int START_DEPENDENCY_ARTIFACT_ID_VALUE = 591;
+    private static final int MIDDLE_DEPENDENCY_ARTIFACT_ID_VALUE = 599;
+    private static final int END_DEPENDENCY_ARTIFACT_ID_VALUE = 603;
+    
+    private Document testDocument;
+    private HyperlinkProviderImpl classUnderTest;
+    
+    static {
+        System.setProperty("org.openide.windows.DummyWindowManager.VISIBLE", 
"false");
+    }
+    
+    public HyperlinkProviderImplTestForMultiPomProjects(String n) {
+        super(n);
+    }
+    
+    @BeforeClass
+    @Override
+    public void setUp() {
+        classUnderTest = new HyperlinkProviderImpl();
+    }
+    
+    @AfterClass
+    @Override
+    public void tearDown() throws IOException {
+        classUnderTest = null;
+    }
+    
+    private Document generateTestPomDocument() throws BadLocationException, 
Exception {
+        if (testDocument == null) {
+            POMDataObject docDataObject = getTestMavenProjectPom();
+            EditorCookie cookie = 
docDataObject.getLookup().lookup(EditorCookie.class);
+            
+            testDocument = cookie.openDocument();
+            testDocument.putProperty(Language.class, XMLTokenId.language());
+        }
+        
+        return testDocument;
+    }
+    
+    public void 
testHyperlinkPointMatchesMavenDependencyWhenNoVersionIsDefined() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_GROUP_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_GROUP_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    public void testHyperlinkSpanForMavenDependencyWhenNoVersionIsDefined() 
throws BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        int[] hyperlinkSpan1 = classUnderTest.getHyperlinkSpan(doc, 
START_DEPENDENCY_GROUP_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan1);
+        
+        int[] hyperlinkSpan2 = classUnderTest.getHyperlinkSpan(doc, 
START_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_DEPENDENCY_GROUP_ID_VALUE, hyperlinkSpan2[0]); 
+        assertEquals(END_DEPENDENCY_GROUP_ID_VALUE + 1, hyperlinkSpan2[1]); 
+        
+        int[] hyperlinkSpan3 = classUnderTest.getHyperlinkSpan(doc, 
MIDDLE_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_DEPENDENCY_GROUP_ID_VALUE, hyperlinkSpan3[0]); 
+        assertEquals(END_DEPENDENCY_GROUP_ID_VALUE + 1, hyperlinkSpan3[1]);
+        
+        int[] hyperlinkSpan4 = classUnderTest.getHyperlinkSpan(doc, 
END_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_DEPENDENCY_GROUP_ID_VALUE, hyperlinkSpan4[0]); 
+        assertEquals(END_DEPENDENCY_GROUP_ID_VALUE + 1, hyperlinkSpan4[1]); 
+
+        int[] hyperlinkSpan5 = classUnderTest.getHyperlinkSpan(doc, 
END_DEPENDENCY_GROUP_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan5);
+        
+        int[] hyperlinkSpan6 = classUnderTest.getHyperlinkSpan(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan6);
+        
+        int[] hyperlinkSpan7 = classUnderTest.getHyperlinkSpan(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_DEPENDENCY_ARTIFACT_ID_VALUE, hyperlinkSpan7[0]); 
+        assertEquals(END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, hyperlinkSpan7[1]); 
+        
+        int[] hyperlinkSpan8 = classUnderTest.getHyperlinkSpan(doc, 
MIDDLE_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_DEPENDENCY_ARTIFACT_ID_VALUE, hyperlinkSpan8[0]); 
+        assertEquals(END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, hyperlinkSpan8[1]);
+        
+        int[] hyperlinkSpan9 = classUnderTest.getHyperlinkSpan(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_DEPENDENCY_ARTIFACT_ID_VALUE, hyperlinkSpan9[0]); 
+        assertEquals(END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, hyperlinkSpan9[1]); 
+
+        int[] hyperlinkSpan10 = classUnderTest.getHyperlinkSpan(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan10);
+    }
+    
+    public void testTooltipTextMatchesMavenDependencyWhenNoVersionIsDefined() 
throws BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, START_DEPENDENCY_GROUP_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertTrue(classUnderTest.getTooltipText(doc, 
START_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
MIDDLE_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
END_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, END_DEPENDENCY_GROUP_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, START_DEPENDENCY_ARTIFACT_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertTrue(classUnderTest.getTooltipText(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
MIDDLE_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    private POMDataObject getTestMavenProjectPom() throws Exception {
+        LocalFileSystem lfs = new LocalFileSystem();
+        lfs.setRootDirectory(new File(getDataDir(),"test_projects"));
+        FileObject pom = lfs.findResource("hyperlinks2/subModule/pom.xml");
+        return (POMDataObject) DataObject.find(pom);
+    }
+}
diff --git 
a/maven.grammar/test/unit/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImplTestForSinglePomProjects.java
 
b/maven.grammar/test/unit/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImplTestForSinglePomProjects.java
new file mode 100644
index 0000000..eceda15
--- /dev/null
+++ 
b/maven.grammar/test/unit/src/org/netbeans/modules/maven/hyperlinks/HyperlinkProviderImplTestForSinglePomProjects.java
@@ -0,0 +1,285 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.netbeans.modules.maven.hyperlinks;
+
+import java.io.File;
+import java.io.IOException;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.netbeans.api.lexer.Language;
+import org.netbeans.api.xml.lexer.XMLTokenId;
+import org.netbeans.junit.NbTestCase;
+import org.netbeans.lib.editor.hyperlink.spi.HyperlinkType;
+import org.netbeans.modules.maven.grammar.POMDataObject;
+import org.openide.cookies.EditorCookie;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.LocalFileSystem;
+import org.openide.loaders.DataObject;
+
+/**
+ * Unit tests for the HyperlinkProvider for pom.xml within a single project.
+ */
+public class HyperlinkProviderImplTestForSinglePomProjects extends NbTestCase {
+    
+    /* Maven Repository URL */
+    private static final int START_URL_VALUE = 577;
+    private static final int MIDDLE_URL_VALUE = 595;
+    private static final int END_URL_VALUE = 611;
+    
+    /* dependency - org.apache.commons:commons-lang3:3.7 */
+    private static final int START_DEPENDENCY_GROUP_ID_VALUE = 849;
+    private static final int MIDDLE_DEPENDENCY_GROUP_ID_VALUE = 857;
+    private static final int END_DEPENDENCY_GROUP_ID_VALUE = 866;
+    
+    private static final int START_DEPENDENCY_ARTIFACT_ID_VALUE = 902;
+    private static final int MIDDLE_DEPENDENCY_ARTIFACT_ID_VALUE = 909;
+    private static final int END_DEPENDENCY_ARTIFACT_ID_VALUE = 914;
+    
+    private static final int START_DEPENDENCY_VERSION_ID_VALUE = 950;
+    private static final int MIDDLE_DEPENDENCY_VERSION_ID_VALUE = 951;
+    private static final int END_DEPENDENCY_VERSION_ID_VALUE = 952;
+    
+    /* dependency - org.mockito:mockito-core:1.10.9 - uses property for 
version: mockito.version*/
+    private static final int START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE 
= 1028;
+    private static final int MIDDLE_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE 
= 1034;
+    private static final int END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE = 
1038;
+    
+    private static final int 
START_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE = 1074;
+    private static final int 
MIDDLE_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE = 1079;
+    private static final int END_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE 
= 1085;
+    
+    private static final int START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE = 
1123;
+    private static final int MIDDLE_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE 
= 1131;
+    private static final int END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE = 
1138;
+    
+    /* plugin - maven-compiler-plugin:org.apache.maven.plugins:3.1 */
+    private static final int START_PLUGIN_ARTIFACT_ID_VALUE = 1271;
+    private static final int MIDDLE_PLUGIN_ARTIFACT_ID_VALUE = 1281;
+    private static final int END_PLUGIN_ARTIFACT_ID_VALUE = 1292;
+    
+    private static final int START_PLUGIN_GROUP_ID_VALUE = 1331;
+    private static final int MIDDLE_PLUGIN_GROUP_ID_VALUE = 1342;
+    private static final int END_PLUGIN_GROUP_ID_VALUE = 1366;
+    
+    private Document testDocument;
+    private HyperlinkProviderImpl classUnderTest;
+    
+    static {
+        System.setProperty("org.openide.windows.DummyWindowManager.VISIBLE", 
"false");
+    }
+    
+    public HyperlinkProviderImplTestForSinglePomProjects(String n) {
+        super(n);
+    }
+    
+    @BeforeClass
+    @Override
+    public void setUp() {
+        classUnderTest = new HyperlinkProviderImpl();
+    }
+    
+    @AfterClass
+    @Override
+    public void tearDown() throws IOException {
+        classUnderTest = null;
+    }
+    
+    private Document generateTestPomDocument() throws BadLocationException, 
Exception {
+        if (testDocument == null) {
+            POMDataObject docDataObject = getTestMavenProjectPom();
+            EditorCookie cookie = 
docDataObject.getLookup().lookup(EditorCookie.class);
+            
+            testDocument = cookie.openDocument();
+            testDocument.putProperty(Language.class, XMLTokenId.language());
+        }
+        
+        return testDocument;
+    }
+    
+    public void testHyperlinkPointMatchesUsedMavenProperty() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    public void testHyperlinkPointMatchesUrl() throws BadLocationException, 
Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_URL_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_URL_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_URL_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, END_URL_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, END_URL_VALUE 
+ 1, HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    public void testHyperlinkPointMatchesMavenDependency() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_GROUP_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_GROUP_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_VERSION_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_DEPENDENCY_VERSION_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_DEPENDENCY_VERSION_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_VERSION_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_DEPENDENCY_VERSION_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    public void testHyperlinkPointDoesntMatchMavenPlugin() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_PLUGIN_ARTIFACT_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_PLUGIN_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_PLUGIN_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_PLUGIN_ARTIFACT_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_PLUGIN_ARTIFACT_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_PLUGIN_GROUP_ID_VALUE - 1, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_PLUGIN_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_PLUGIN_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_PLUGIN_GROUP_ID_VALUE, HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_PLUGIN_GROUP_ID_VALUE + 1, HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    public void 
testHyperlinkPointMatchesMavenDependencyWhenDependencyUsesVersionProperty() 
throws BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
START_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
START_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
MIDDLE_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(true, classUnderTest.isHyperlinkPoint(doc, 
END_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals(false, classUnderTest.isHyperlinkPoint(doc, 
END_VERSION_PROPERTY_DEPENDENCY_ARTIFACT_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    public void testHyperlinkSpanForMavenProperty() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        int[] hyperlinkSpan1 = classUnderTest.getHyperlinkSpan(doc, 
START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan1);
+        
+        int[] hyperlinkSpan2 = classUnderTest.getHyperlinkSpan(doc, 
START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE - 2, 
hyperlinkSpan2[0]); 
+        assertEquals(END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE + 1, 
hyperlinkSpan2[1]); 
+        
+        int[] hyperlinkSpan3 = classUnderTest.getHyperlinkSpan(doc, 
MIDDLE_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE - 2, 
hyperlinkSpan3[0]); 
+        assertEquals(END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE + 1, 
hyperlinkSpan3[1]); 
+        
+        int[] hyperlinkSpan4 = classUnderTest.getHyperlinkSpan(doc, 
END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE - 2, 
hyperlinkSpan4[0]); 
+        assertEquals(END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE + 1, 
hyperlinkSpan4[1]); 
+
+        int[] hyperlinkSpan5 = classUnderTest.getHyperlinkSpan(doc, 
END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan5);
+    }
+    
+    public void testHyperlinkSpanForUrl() throws BadLocationException, 
Exception {
+        Document doc = generateTestPomDocument();
+        int[] hyperlinkSpan1 = classUnderTest.getHyperlinkSpan(doc, 
START_URL_VALUE - 1, HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan1);
+        
+        int[] hyperlinkSpan2 = classUnderTest.getHyperlinkSpan(doc, 
START_URL_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_URL_VALUE, hyperlinkSpan2[0]); 
+        assertEquals(END_URL_VALUE + 1, hyperlinkSpan2[1]); 
+        
+        int[] hyperlinkSpan3 = classUnderTest.getHyperlinkSpan(doc, 
MIDDLE_URL_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_URL_VALUE, hyperlinkSpan3[0]); 
+        assertEquals(END_URL_VALUE + 1, hyperlinkSpan3[1]);
+        
+        int[] hyperlinkSpan4 = classUnderTest.getHyperlinkSpan(doc, 
END_URL_VALUE, HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_URL_VALUE, hyperlinkSpan4[0]); 
+        assertEquals(END_URL_VALUE + 1, hyperlinkSpan4[1]); 
+
+        int[] hyperlinkSpan5 = classUnderTest.getHyperlinkSpan(doc, 
END_URL_VALUE + 1, HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan5);
+    }
+    
+    public void testHyperlinkSpanForMavenDependency() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        int[] hyperlinkSpan1 = classUnderTest.getHyperlinkSpan(doc, 
START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan1);
+        
+        int[] hyperlinkSpan2 = classUnderTest.getHyperlinkSpan(doc, 
START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
hyperlinkSpan2[0]); 
+        assertEquals(END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE + 1, 
hyperlinkSpan2[1]); 
+        
+        int[] hyperlinkSpan3 = classUnderTest.getHyperlinkSpan(doc, 
MIDDLE_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
hyperlinkSpan3[0]); 
+        assertEquals(END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE + 1, 
hyperlinkSpan3[1]);
+        
+        int[] hyperlinkSpan4 = classUnderTest.getHyperlinkSpan(doc, 
END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION);
+        assertEquals(START_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE, 
hyperlinkSpan4[0]); 
+        assertEquals(END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE + 1, 
hyperlinkSpan4[1]); 
+
+        int[] hyperlinkSpan5 = classUnderTest.getHyperlinkSpan(doc, 
END_VERSION_PROPERTY_DEPENDENCY_GROUP_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION);
+        assertNull(hyperlinkSpan5);
+    }
+    
+    public void testTooltipTextMatchesUsedMavenProperty() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, 
START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals("mockito.version resolves to \'1.10.9\'\nNavigate to 
definition.", classUnderTest.getTooltipText(doc, 
START_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals("mockito.version resolves to \'1.10.9\'\nNavigate to 
definition.", classUnderTest.getTooltipText(doc, 
MIDDLE_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals("mockito.version resolves to \'1.10.9\'\nNavigate to 
definition.", classUnderTest.getTooltipText(doc, 
END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE, 
HyperlinkType.GO_TO_DECLARATION));
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, 
END_VERSION_PROPERTY_DEPENDENCY_VERSION_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    public void testTooltipTextMatchesMavenDependency() throws 
BadLocationException, Exception {
+        Document doc = generateTestPomDocument();
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, START_DEPENDENCY_GROUP_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertTrue(classUnderTest.getTooltipText(doc, 
START_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
MIDDLE_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
END_DEPENDENCY_GROUP_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, END_DEPENDENCY_GROUP_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, START_DEPENDENCY_ARTIFACT_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertTrue(classUnderTest.getTooltipText(doc, 
START_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
MIDDLE_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
END_DEPENDENCY_ARTIFACT_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, END_DEPENDENCY_ARTIFACT_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+        
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, START_DEPENDENCY_VERSION_ID_VALUE - 1, 
HyperlinkType.GO_TO_DECLARATION));
+        assertTrue(classUnderTest.getTooltipText(doc, 
START_DEPENDENCY_VERSION_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
MIDDLE_DEPENDENCY_VERSION_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertTrue(classUnderTest.getTooltipText(doc, 
END_DEPENDENCY_VERSION_ID_VALUE, 
HyperlinkType.GO_TO_DECLARATION).endsWith("org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.pom"));
+        assertEquals("Cannot resolve expression\nNavigates to definition.", 
classUnderTest.getTooltipText(doc, END_DEPENDENCY_VERSION_ID_VALUE + 1, 
HyperlinkType.GO_TO_DECLARATION));
+    }
+    
+    private POMDataObject getTestMavenProjectPom() throws Exception {
+        LocalFileSystem lfs = new LocalFileSystem();
+        lfs.setRootDirectory(new File(getDataDir(),"test_projects"));
+        FileObject pom = lfs.findResource("hyperlinks/pom.xml");
+        return (POMDataObject) DataObject.find(pom);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to