From 836e6edad0c336fb8d4d67a88e3e38c65818ee4d Mon Sep 17 00:00:00 2001 From: azerr Date: Tue, 12 May 2020 21:05:39 +0200 Subject: [PATCH] No hyperlink to DTD source on hover Fixes #693 Signed-off-by: azerr --- .../model/ContentModelManager.java | 2 +- .../java/org/eclipse/lemminx/XMLAssert.java | 25 ++--- .../contentmodel/DTDHoverExtensionsTest.java | 95 +++++++++++++++---- .../XMLSchemaHoverExtensionsTest.java | 9 +- .../extensions/AggregetedHoverValuesTest.java | 8 +- .../extensions/HTMLHoverExtensionsTest.java | 31 +++--- 6 files changed, 120 insertions(+), 50 deletions(-) diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java index 5c1ed647a..5db4b30e6 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java @@ -150,7 +150,7 @@ private CMDocument findCMDocument(String uri, String publicId, String systemId, try { Path file = cacheResolverExtension.getCachedResource(resolvedUri); if (file != null) { - cmDocument = modelProvider.createCMDocument(file.toFile().getPath()); + cmDocument = modelProvider.createCMDocument(file.toUri().toString()); } } catch (CacheResourceDownloadingException e) { // the DTD/XML Schema is downloading diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/XMLAssert.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/XMLAssert.java index a87fc9c26..302e273c6 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/XMLAssert.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/XMLAssert.java @@ -16,7 +16,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -97,7 +96,7 @@ public class XMLAssert { public static final int NEW_XML_SNIPPETS = 7; public static final int NEW_XSD_SNIPPETS = 1; - + public static final int PROLOG_SNIPPETS = 2; public static final int REGION_SNIPPETS = 2; @@ -577,13 +576,21 @@ public static void assertHover(String value) throws BadLocationException { assertHover(value, null, null); } - public static void assertHover(String value, String expectedHoverLabel, Integer expectedHoverOffset) + public static void assertHover(String value, String expectedHoverLabel, Range expectedHoverRange) throws BadLocationException { - assertHover(new XMLLanguageService(), value, null, null, expectedHoverLabel, expectedHoverOffset); + assertHover(new XMLLanguageService(), value, null, null, expectedHoverLabel, expectedHoverRange); } public static void assertHover(XMLLanguageService xmlLanguageService, String value, String catalogPath, - String fileURI, String expectedHoverLabel, Integer expectedHoverOffset) throws BadLocationException { + String fileURI, String expectedHoverLabel, Range expectedHoverRange) throws BadLocationException { + ContentModelSettings settings = new ContentModelSettings(); + settings.setUseCache(false); + assertHover(xmlLanguageService, value, catalogPath, fileURI, expectedHoverLabel, expectedHoverRange, settings); + } + + public static void assertHover(XMLLanguageService xmlLanguageService, String value, String catalogPath, + String fileURI, String expectedHoverLabel, Range expectedHoverRange, ContentModelSettings settings) + throws BadLocationException { int offset = value.indexOf("|"); value = value.substring(0, offset) + value.substring(offset + 1); @@ -592,8 +599,6 @@ public static void assertHover(XMLLanguageService xmlLanguageService, String val Position position = document.positionAt(offset); DOMDocument htmlDoc = DOMParser.getInstance().parse(document, xmlLanguageService.getResolverExtensionManager()); - ContentModelSettings settings = new ContentModelSettings(); - settings.setUseCache(false); // Configure XML catalog for XML schema if (catalogPath != null) { settings.setCatalogs(new String[] { catalogPath }); @@ -609,10 +614,8 @@ public static void assertHover(XMLLanguageService xmlLanguageService, String val } else { String actualHoverLabel = getHoverLabel(hover); assertEquals(expectedHoverLabel, actualHoverLabel); - if (expectedHoverOffset != null) { - assertNotNull(hover.getRange()); - assertNotNull(hover.getRange().getStart()); - assertEquals(expectedHoverOffset.intValue(), hover.getRange().getStart().getCharacter()); + if (expectedHoverRange != null) { + assertEquals(hover.getRange(), expectedHoverRange); } } } diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/DTDHoverExtensionsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/DTDHoverExtensionsTest.java index 642d12e39..5d4818797 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/DTDHoverExtensionsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/DTDHoverExtensionsTest.java @@ -13,11 +13,24 @@ */ package org.eclipse.lemminx.extensions.contentmodel; +import static org.eclipse.lemminx.XMLAssert.r; +import static org.junit.jupiter.api.Assertions.fail; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; + import org.apache.xerces.impl.XMLEntityManager; import org.apache.xerces.util.URI.MalformedURIException; import org.eclipse.lemminx.XMLAssert; import org.eclipse.lemminx.commons.BadLocationException; +import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings; import org.eclipse.lemminx.services.XMLLanguageService; +import org.eclipse.lemminx.uriresolver.CacheResourceDownloadingException; +import org.eclipse.lemminx.uriresolver.CacheResourcesManager; +import org.eclipse.lemminx.uriresolver.FileServer; +import org.eclipse.lsp4j.Range; import org.junit.jupiter.api.Test; public class DTDHoverExtensionsTest { @@ -27,16 +40,16 @@ public void testTagHover() throws BadLocationException, MalformedURIException { String dtdURI = getDTDFileURI("liferay-service-builder_7_2_0.dtd"); String xml = "\r\n" + // "" - + ""; - assertHover(xml,"The service-builder element is the root of the deployment descriptor for" + // - " a Service Builder descriptor that is used to generate services available to" + - " portlets. The Service Builder saves the developer time by generating Spring" + - " utilities, SOAP utilities, and Hibernate persistence classes to ease the" + - " development of services." - + // - System.lineSeparator() + // - System.lineSeparator() + "Source: [liferay-service-builder_7_2_0.dtd](" + dtdURI + ")", - 206); + + // + ""; + assertHover(xml, "The service-builder element is the root of the deployment descriptor for" + // + " a Service Builder descriptor that is used to generate services available to" + // + " portlets. The Service Builder saves the developer time by generating Spring" + // + " utilities, SOAP utilities, and Hibernate persistence classes to ease the" + // + " development of services." + // + System.lineSeparator() + // + System.lineSeparator() + "Source: [liferay-service-builder_7_2_0.dtd](" + dtdURI + ")", + r(1, 206, 1, 221)); } @Test @@ -44,19 +57,63 @@ public void testAttributeNameHover() throws BadLocationException, MalformedURIEx String dtdURI = getDTDFileURI("liferay-service-builder_7_2_0.dtd"); String xml = "\r\n" + // "" - + ""; - assertHover(xml, - "The package-path value specifies the package of the generated code." - + // - System.lineSeparator() + // - System.lineSeparator() + "Source: [liferay-service-builder_7_2_0.dtd](" + dtdURI + ")", - null); + + // + ""; + assertHover(xml, "The package-path value specifies the package of the generated code." + // + + System.lineSeparator() + // + System.lineSeparator() + "Source: [liferay-service-builder_7_2_0.dtd](" + dtdURI + ")", null); } - private static void assertHover(String value, String expectedHoverLabel, Integer expectedHoverOffset) + @Test + public void webXML() throws Exception { + FileServer server = new FileServer(); + try { + server.start(); + // Delete the cached DTD file by waiting 1 sec + String httpDTDUri = server.getUri("/dtd/web-app_2_3.dtd"); + Path cachedFilePath = CacheResourcesManager.getResourceCachePath(httpDTDUri); + Files.deleteIfExists(cachedFilePath); + + // Download the DTD by waiting 1 sec + CacheResourcesManager cacheResourcesManager = new CacheResourcesManager(); + try { + cacheResourcesManager.getResource(httpDTDUri); + } catch (CacheResourceDownloadingException ignored) { + } + TimeUnit.MILLISECONDS.sleep(200); + + // Process hover with the DTD (http dtd) + String dtdFileCacheURI = cachedFilePath.toUri().toString().replace("file:///", "file:/"); + String xml = "\n" + // + "\n" + // + "\n" + // + " Servlet 2.3 Web Application\n" + // + ""; + assertHoverWithCache(xml, + "The web-app element is the root of the deployment descriptor for a web application." + // + System.lineSeparator() + // + System.lineSeparator() + "Source: [web-app_2_3.dtd](" + dtdFileCacheURI + ")", + r(4, 1, 4, 8)); + } finally { + server.stop(); + } + } + + private static void assertHover(String value, String expectedHoverLabel, Range expectedHoverRange) throws BadLocationException { XMLAssert.assertHover(new XMLLanguageService(), value, "src/test/resources/catalogs/catalog-liferay.xml", null, - expectedHoverLabel, expectedHoverOffset); + expectedHoverLabel, expectedHoverRange); + } + + private static void assertHoverWithCache(String value, String expectedHoverLabel, Range expectedHoverRange) + throws BadLocationException { + ContentModelSettings settings = new ContentModelSettings(); + settings.setUseCache(true); + XMLAssert.assertHover(new XMLLanguageService(), value, null, null, expectedHoverLabel, expectedHoverRange, + settings); } private static String getDTDFileURI(String dtdURI) throws MalformedURIException { diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaHoverExtensionsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaHoverExtensionsTest.java index 2bf177d94..c646d4eb5 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaHoverExtensionsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaHoverExtensionsTest.java @@ -12,12 +12,15 @@ */ package org.eclipse.lemminx.extensions.contentmodel; +import static org.eclipse.lemminx.XMLAssert.r; + import org.apache.xerces.impl.XMLEntityManager; import org.apache.xerces.util.URI.MalformedURIException; import org.eclipse.lemminx.XMLAssert; import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.extensions.xsi.XSISchemaModel; import org.eclipse.lemminx.services.XMLLanguageService; +import org.eclipse.lsp4j.Range; import org.junit.jupiter.api.Test; /** @@ -37,7 +40,7 @@ public void testTagHover() throws BadLocationException, MalformedURIException { + // System.lineSeparator() + // System.lineSeparator() + "Source: [spring-beans-3.0.xsd](" + schemaURI + ")", - 2); + r(2, 2, 2, 6)); }; @Test @@ -222,10 +225,10 @@ public void hoverCacheBug() throws BadLocationException, MalformedURIException { } - private static void assertHover(String value, String expectedHoverLabel, Integer expectedHoverOffset) + private static void assertHover(String value, String expectedHoverLabel, Range expectedHoverRange) throws BadLocationException { XMLAssert.assertHover(new XMLLanguageService(), value, "src/test/resources/catalogs/catalog.xml", null, - expectedHoverLabel, expectedHoverOffset); + expectedHoverLabel, expectedHoverRange); } private static String getXMLSchemaFileURI(String schemaURI) throws MalformedURIException { diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/AggregetedHoverValuesTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/AggregetedHoverValuesTest.java index abce9297f..25516c0cb 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/AggregetedHoverValuesTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/AggregetedHoverValuesTest.java @@ -13,11 +13,15 @@ */ package org.eclipse.lemminx.services.extensions; + +import static org.eclipse.lemminx.XMLAssert.r; + import org.apache.xerces.impl.XMLEntityManager; import org.apache.xerces.util.URI.MalformedURIException; import org.eclipse.lemminx.XMLAssert; import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.services.XMLLanguageService; +import org.eclipse.lsp4j.Range; import org.junit.jupiter.api.Test; /** @@ -45,7 +49,7 @@ public void testTagHover() throws BadLocationException, MalformedURIException { System.lineSeparator() + "Source: [spring-beans-3.0.xsd](" + schemaURI + ")" + HOVER_SEPARATOR + System.lineSeparator() + System.lineSeparator(), - 2); + r(2, 2, 2, 6)); }; @Test @@ -67,7 +71,7 @@ public void testAttributeNameHover() throws BadLocationException, MalformedURIEx null); }; - private static void assertHover(String value, String expectedHoverLabel, Integer expectedHoverOffset) + private static void assertHover(String value, String expectedHoverLabel, Range expectedHoverOffset) throws BadLocationException { XMLAssert.assertHover(new AggregatedHoverLanguageService(), value, "src/test/resources/catalogs/catalog.xml", null, expectedHoverLabel, expectedHoverOffset); diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/HTMLHoverExtensionsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/HTMLHoverExtensionsTest.java index 7a4928207..ac6decd03 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/HTMLHoverExtensionsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/extensions/HTMLHoverExtensionsTest.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018 Angelo ZERR + * Copyright (c) 201r(0,8,0, 12)-2020 Angelo ZERR * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -12,9 +12,11 @@ */ package org.eclipse.lemminx.services.extensions; +import static org.eclipse.lemminx.XMLAssert.r; import org.eclipse.lemminx.XMLAssert; import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.services.XMLLanguageService; +import org.eclipse.lsp4j.Range; import org.junit.jupiter.api.Test; /** @@ -27,28 +29,28 @@ public class HTMLHoverExtensionsTest { @Test public void testSingle() throws BadLocationException { assertHover("|"); - assertHover("<|html>", "", 1); - assertHover("", "", 1); - assertHover("", "", 1); - assertHover("", "", 1); + assertHover("<|html>", "", r(0, 1, 0, 5)); + assertHover("", "", r(0, 1, 0, 5)); + assertHover("", "", r(0, 1, 0, 5)); + assertHover("", "", r(0, 1, 0, 5)); assertHover("|"); assertHover("<|/html>"); - assertHover("", "", 8); - assertHover("", "", 8); - assertHover("", "", 8); - assertHover("", "", 8); - assertHover("", "", 8); + assertHover("", "", r(0, 8, 0, 12)); + assertHover("", "", r(0, 8, 0, 12)); + assertHover("", "", r(0, 8, 0, 12)); + assertHover("", "", r(0, 8, 0, 12)); + assertHover("", "", r(0, 8, 0, 12)); assertHover("|"); - assertHover("hover|Text", "hoverText", 6); - assertHover("h|overText", "hoverText", 6); - assertHover(" |", " ", 6); + assertHover("hover|Text", "hoverText", r(0, 6, 0, 15)); + assertHover("h|overText", "hoverText", r(0, 6, 0, 15)); + assertHover(" |", " ", r(0, 6, 0, 7)); }; private static void assertHover(String value) throws BadLocationException { assertHover(value, null, null); } - private static void assertHover(String value, String expectedHoverLabel, Integer expectedHoverOffset) + private static void assertHover(String value, String expectedHoverLabel, Range expectedHoverOffset) throws BadLocationException { XMLAssert.assertHover(new HTMLLanguageService(), value, null, null, expectedHoverLabel, expectedHoverOffset); } @@ -68,6 +70,7 @@ public String onTag(IHoverRequest request) { String tagLabel = request.isOpen() ? "<" + tag + ">" : ""; return tagLabel; } + @Override public String onText(IHoverRequest request) throws Exception { return request.getNode().getTextContent();