diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/participants/diagnostics/XMLValidator.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/participants/diagnostics/XMLValidator.java index 6bde7f2f2a..b66a52fabb 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/participants/diagnostics/XMLValidator.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/participants/diagnostics/XMLValidator.java @@ -13,7 +13,9 @@ package org.eclipse.lemminx.extensions.contentmodel.participants.diagnostics; import java.io.IOException; +import java.io.InputStream; import java.io.StringReader; +import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,8 +30,12 @@ import org.eclipse.lemminx.dom.DOMDocument; import org.eclipse.lemminx.dom.DOMDocumentType; import org.eclipse.lemminx.dom.DOMElement; +import org.eclipse.lemminx.dom.NoNamespaceSchemaLocation; +import org.eclipse.lemminx.dom.SchemaLocationHint; import org.eclipse.lemminx.extensions.contentmodel.model.ContentModelManager; import org.eclipse.lemminx.extensions.contentmodel.participants.XMLSyntaxErrorCode; +import org.eclipse.lemminx.extensions.contentmodel.settings.SchemaEnabled; +import org.eclipse.lemminx.extensions.contentmodel.settings.XMLSchemaSettings; import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings; import org.eclipse.lemminx.services.extensions.diagnostics.LSPContentHandler; import org.eclipse.lemminx.uriresolver.CacheResourceDownloadingException; @@ -82,19 +88,24 @@ public static void doDiagnostics(DOMDocument document, XMLEntityResolver entityR // Add LSP content handler to stop XML parsing if monitor is canceled. parser.setContentHandler(new LSPContentHandler(monitor)); - boolean hasSchemaGrammar = document.hasSchemaLocation() || document.hasNoNamespaceSchemaLocation() - || hasExternalSchemaGrammar(document); - boolean hasGrammar = document.hasDTD() || hasSchemaGrammar || document.hasExternalGrammar(); - // If diagnostics for Schema preference is enabled - if ((validationSettings == null) || validationSettings.isSchema()) { + // warn if XML document is not bound to a grammar according the settings + warnNoGrammar(document, diagnostics, validationSettings); + // Update external grammar location (file association) + updateExternalGrammarLocation(document, parser); - updateExternalGrammarLocation(document, parser); - parser.setFeature("http://apache.org/xml/features/validation/schema", hasSchemaGrammar); //$NON-NLS-1$ + boolean hasSchemaLocation = document.hasSchemaLocation(); + boolean hasNoNamespaceSchemaLocation = document.hasNoNamespaceSchemaLocation(); + boolean hasSchemaGrammar = hasSchemaLocation || hasNoNamespaceSchemaLocation + || hasExternalSchemaGrammar(document); + boolean schemaValidationEnabled = (hasSchemaGrammar + && isSchemaValidationEnabled(document, validationSettings) + || (hasNoNamespaceSchemaLocation + && isNoNamespaceSchemaValidationEnabled(document, validationSettings))); + parser.setFeature("http://apache.org/xml/features/validation/schema", schemaValidationEnabled); //$NON-NLS-1$ - // warn if XML document is not bound to a grammar according the settings - warnNoGrammar(document, diagnostics, validationSettings); - } else { - hasGrammar = false; // validation for Schema was disabled + boolean hasGrammar = document.hasDTD() || hasSchemaGrammar || document.hasExternalGrammar(); + if (hasSchemaGrammar && !schemaValidationEnabled) { + hasGrammar = false; } parser.setFeature("http://xml.org/sax/features/validation", hasGrammar); //$NON-NLS-1$ @@ -114,6 +125,116 @@ public static void doDiagnostics(DOMDocument document, XMLEntityResolver entityR } } + private static boolean isSchemaValidationEnabled(DOMDocument document, XMLValidationSettings validationSettings) { + if (validationSettings == null) { + return true; + } + SchemaEnabled enabled = SchemaEnabled.always; + XMLSchemaSettings schemaSettings = validationSettings.getSchema(); + if (schemaSettings != null && schemaSettings.getEnabled() != null) { + enabled = schemaSettings.getEnabled(); + } + switch (enabled) { + case always: + return true; + case never: + return false; + case onValidSchema: + return isValidSchemaLocation(document); + default: + return true; + } + } + + /** + * Returns true if the given DOM document declares a xsi:schemaLocation hint for + * the document root element is valid and false otherwise. + * + * The xsi:schemaLocation is valid if: + * + * + * + * @param document the DOM document. + * @return true if the given DOM document declares a xsi:schemaLocation hint for + * the document root element is valid and false otherwise. + */ + private static boolean isValidSchemaLocation(DOMDocument document) { + if (!document.hasSchemaLocation()) { + return false; + } + String namespaceURI = document.getNamespaceURI(); + SchemaLocationHint hint = document.getSchemaLocation().getLocationHint(namespaceURI); + if (hint == null) { + return false; + } + String location = hint.getHint(); + if (StringUtils.isBlank(location)) { + return false; + } + try (InputStream is = new URL(location).openStream()) { + return true; + } catch (Exception e) { + return false; + } + } + + private static boolean isNoNamespaceSchemaValidationEnabled(DOMDocument document, + XMLValidationSettings validationSettings) { + if (validationSettings == null) { + return true; + } + SchemaEnabled enabled = SchemaEnabled.always; + XMLSchemaSettings schemaSettings = validationSettings.getSchema(); + if (schemaSettings != null && schemaSettings.getEnabled() != null) { + enabled = schemaSettings.getEnabled(); + } + switch (enabled) { + case always: + return true; + case never: + return false; + case onValidSchema: + return isValidNoNamespaceSchemaLocation(document); + default: + return true; + } + } + + /** + * Returns true if the given DOM document declares a + * xsi:noNamespaceSchemaLocation which is valid and false otherwise. + * + * The xsi:noNamespaceSchemaLocation is valid if: + * + * + * + * @param document the DOM document. + * @return true if the given DOM document declares a xsi:schemaLocation hint for + * the document root element is valid and false otherwise. + */ + private static boolean isValidNoNamespaceSchemaLocation(DOMDocument document) { + NoNamespaceSchemaLocation noNamespaceSchemaLocation = document.getNoNamespaceSchemaLocation(); + if (noNamespaceSchemaLocation == null) { + return false; + } + String location = noNamespaceSchemaLocation.getLocation(); + if (StringUtils.isBlank(location)) { + return false; + } + try (InputStream is = new URL(location).openStream()) { + return true; + } catch (Exception e) { + return false; + } + } + private static boolean hasExternalSchemaGrammar(DOMDocument document) { if (document.getExternalGrammarFromNamespaceURI() != null) { return true; diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/SchemaEnabled.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/SchemaEnabled.java new file mode 100644 index 0000000000..4090f93fc8 --- /dev/null +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/SchemaEnabled.java @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2020 Red Hat Inc. and others. + * 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 + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat Inc. - initial API and implementation + */ +package org.eclipse.lemminx.extensions.contentmodel.settings; + +public enum SchemaEnabled { + always, never, onValidSchema; +} \ No newline at end of file diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/XMLSchemaSettings.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/XMLSchemaSettings.java new file mode 100644 index 0000000000..ca611d9dda --- /dev/null +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/XMLSchemaSettings.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2020 Red Hat Inc. and others. + * 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 + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat Inc. - initial API and implementation + */ +package org.eclipse.lemminx.extensions.contentmodel.settings; + +public class XMLSchemaSettings { + + public XMLSchemaSettings() { + setEnabled(SchemaEnabled.always); + } + + private SchemaEnabled enabled; + + public void setEnabled(SchemaEnabled enabled) { + this.enabled = enabled; + } + + public SchemaEnabled getEnabled() { + return enabled; + } +} diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/XMLValidationSettings.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/XMLValidationSettings.java index c1e42a4873..58fe3c5a83 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/XMLValidationSettings.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/settings/XMLValidationSettings.java @@ -20,7 +20,7 @@ */ public class XMLValidationSettings { - private Boolean schema; + private XMLSchemaSettings schema; private Boolean enabled; @@ -31,7 +31,7 @@ public class XMLValidationSettings { /** * This severity preference to mark the root element of XML document which is * not bound to a XML Schema/DTD. - * + * * Values are {ignore, hint, info, warning, error} */ private String noGrammar; @@ -40,7 +40,7 @@ public class XMLValidationSettings { public XMLValidationSettings() { // set defaults - setSchema(true); + //setSchema(new XMLSchemaSettings()); setEnabled(true); setDisallowDocTypeDecl(false); setResolveExternalEntities(false); @@ -61,16 +61,18 @@ public void setEnabled(boolean enabled) { } /** - * @return the schema + * Returns the XML Schema validation settings. + * + * @return the XML Schema validation settings. */ - public boolean isSchema() { + public XMLSchemaSettings getSchema() { return schema; } /** * @param schema the schema to set */ - public void setSchema(boolean schema) { + public void setSchema(XMLSchemaSettings schema) { this.schema = schema; } @@ -85,7 +87,7 @@ public String getNoGrammar() { /** * Returns true if a fatal error is thrown if the incoming document contains a * DOCTYPE declaration and false otherwise. - * + * * @return true if a fatal error is thrown if the incoming document contains a * DOCTYPE declaration and false otherwise. */ @@ -96,7 +98,7 @@ public boolean isDisallowDocTypeDecl() { /** * Set true if a fatal error is thrown if the incoming document contains a * DOCTYPE declaration and false otherwise. - * + * * @param disallowDocTypeDecl disallow DOCTYPE declaration. */ public void setDisallowDocTypeDecl(boolean disallowDocTypeDecl) { @@ -105,7 +107,7 @@ public void setDisallowDocTypeDecl(boolean disallowDocTypeDecl) { /** * Returns true if external entities must be resolved and false otherwise. - * + * * @return true if external entities must be resolved and false otherwise. */ public boolean isResolveExternalEntities() { @@ -114,7 +116,7 @@ public boolean isResolveExternalEntities() { /** * Set true if external entities must be resolved and false otherwise. - * + * * @param resolveExternalEntities resolve extrenal entities */ public void setResolveExternalEntities(boolean resolveExternalEntities) { @@ -124,7 +126,7 @@ public void setResolveExternalEntities(boolean resolveExternalEntities) { /** * Returns the noGrammar severity according the given settings and * {@link DiagnosticSeverity#Hint} otherwise. - * + * * @param validationSettings the validation settings * @return the noGrammar severity according the given settings and * {@link DiagnosticSeverity#Hint} otherwise. 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 0345e66e9e..c779493359 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 @@ -41,6 +41,8 @@ import org.eclipse.lemminx.dom.DOMDocument; import org.eclipse.lemminx.dom.DOMParser; import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings; +import org.eclipse.lemminx.extensions.contentmodel.settings.SchemaEnabled; +import org.eclipse.lemminx.extensions.contentmodel.settings.XMLSchemaSettings; import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings; import org.eclipse.lemminx.extensions.generators.FileContentGeneratorManager; import org.eclipse.lemminx.extensions.generators.FileContentGeneratorSettings; @@ -441,7 +443,7 @@ public static Range r(int startLine, int startCharacter, int endLine, int endCha return new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter)); } - public static ContentModelSettings getContentModelSettings(boolean isEnabled, boolean isSchema) { + public static ContentModelSettings getContentModelSettings(boolean isEnabled, SchemaEnabled schemaEnabled) { ContentModelSettings settings = new ContentModelSettings(); settings.setUseCache(false); XMLValidationSettings problems = new XMLValidationSettings(); @@ -449,7 +451,9 @@ public static ContentModelSettings getContentModelSettings(boolean isEnabled, bo settings.setValidation(problems); XMLValidationSettings diagnostics = new XMLValidationSettings(); diagnostics.setEnabled(isEnabled); - diagnostics.setSchema(isSchema); + XMLSchemaSettings schemaSettings = new XMLSchemaSettings(); + schemaSettings.setEnabled(schemaEnabled); + diagnostics.setSchema(schemaSettings); settings.setValidation(diagnostics); return settings; } diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaDiagnosticsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaDiagnosticsTest.java index 0872e7570b..fbab724ffa 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaDiagnosticsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSchemaDiagnosticsTest.java @@ -31,6 +31,7 @@ import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.extensions.contentmodel.participants.XMLSchemaErrorCode; import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings; +import org.eclipse.lemminx.extensions.contentmodel.settings.SchemaEnabled; import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings; import org.eclipse.lemminx.services.XMLLanguageService; import org.eclipse.lemminx.settings.EnforceQuoteStyle; @@ -1027,12 +1028,48 @@ public void diagnosticsWithCatalogAndXSDInclude() throws BadLocationException { XMLAssert.testDiagnosticsFor(xml, "src/test/resources/catalogs/include/catalog-include.xml", diagnostic); } + @Test + public void noHintSchemaLocationForRootElement() { + // Here the xsi:schemaLocation doens't declare the hint for + // http://www.eclipse.org/oomph/setup/1.0 (used in the root element) + String xml = "\r\n" + // + " \r\n" + // + " \r\n" + + // + " \r\n" + // + " \r\n" + // + " \r\n" + // + " \r\n" + // + " \r\n" + // + ""; + + // always + XMLAssert.testDiagnosticsFor(xml, + d(1, 1, 1, 20, XMLSchemaErrorCode.cvc_elt_1_a, + "cvc-elt.1.a: Cannot find the declaration of element 'setup:Configuration'."), // + d(11, 67, 11, 67, XMLSchemaErrorCode.cvc_elt_4_2, + "cvc-elt.4.2: Cannot resolve 'setup.p2:P2Task' to a type definition for element 'setupTask'.")); + + // on schema valid + ContentModelSettings settings = XMLAssert.getContentModelSettings(true, SchemaEnabled.onValidSchema); + XMLAssert.testDiagnosticsFor(xml, null, null, null, true, settings); + } + private static void testDiagnosticsFor(String xml, Diagnostic... expected) { XMLAssert.testDiagnosticsFor(xml, "src/test/resources/catalogs/catalog.xml", expected); } private static void testDiagnosticsDisabledValidation(String xml) { - ContentModelSettings settings = XMLAssert.getContentModelSettings(true, false); + ContentModelSettings settings = XMLAssert.getContentModelSettings(true, SchemaEnabled.never); XMLAssert.testDiagnosticsFor(xml, "src/test/resources/catalogs/catalog.xml", null, null, true, settings); } diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSyntaxDiagnosticsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSyntaxDiagnosticsTest.java index 5721630cee..b8f5000d6d 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSyntaxDiagnosticsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLSyntaxDiagnosticsTest.java @@ -20,6 +20,7 @@ import org.eclipse.lemminx.XMLAssert; import org.eclipse.lemminx.extensions.contentmodel.participants.XMLSyntaxErrorCode; +import org.eclipse.lemminx.extensions.contentmodel.settings.SchemaEnabled; import org.eclipse.lemminx.settings.EnforceQuoteStyle; import org.eclipse.lemminx.settings.QuoteStyle; import org.eclipse.lemminx.settings.SharedSettings; @@ -630,7 +631,7 @@ public void testMissingQuotesForAttributeSingleQuotes() throws Exception { @Test public void testOpenQuoteExpectedDisabledPreference() throws Exception { String xml = " 10000000"; - testDiagnosticsFor(xml, null, null, null, true, XMLAssert.getContentModelSettings(false, true)); // validation + testDiagnosticsFor(xml, null, null, null, true, XMLAssert.getContentModelSettings(false, SchemaEnabled.always)); // validation // is // disabled } diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/settings/SettingsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/settings/SettingsTest.java index 50485c3beb..779a31c219 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/settings/SettingsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/settings/SettingsTest.java @@ -29,6 +29,7 @@ import org.eclipse.lemminx.client.CodeLensKind; import org.eclipse.lemminx.client.ExtendedClientCapabilities; import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings; +import org.eclipse.lemminx.extensions.contentmodel.settings.SchemaEnabled; import org.eclipse.lemminx.settings.capabilities.InitializationOptionsExtendedClientCapabilities; import org.eclipse.lemminx.utils.FilesUtils; import org.eclipse.lsp4j.FormattingOptions; @@ -53,60 +54,48 @@ public void cleanup() { f.delete(); } } + // @formatter:off - private final String json = - "{\r\n" + - " \"settings\": {\r\n" + // + private final String json = "{\r\n" + " \"settings\": {\r\n" + // // Content model settings - " \"xml\": {\r\n" + - " \"fileAssociations\": [\r\n" + // - " {\r\n" + // - " \"systemId\": \"src\\\\test\\\\resources\\\\xsd\\\\spring-beans-3.0.xsd\",\r\n" + // - " \"pattern\": \"**/test*.xml\"\r\n" + // - " },\r\n" + // - " {\r\n" + // - " \"systemId\": \"src\\\\test\\\\resources\\\\xsd\\\\projectDescription.xsd\",\r\n" + // - " \"pattern\": \"projectDescription.xml\"\r\n" + // - " }\r\n" + // - " ],\r\n" + // - " \"catalogs\": [\r\n" + // - " \"src\\\\test\\\\resources\\\\catalogs\\\\catalog.xml\"\r\n" + // - " ],\r\n" + // - " \"validation\": {\r\n" + // - " \"enabled\": true,\r\n" + // - " \"schema\": false\r\n" + // - " },\r\n" + // - // Client (commons) settings - " \"format\": {\r\n" + // - " \"tabSize\": 10,\r\n" + // - " \"insertSpaces\": false,\r\n" + // - " \"splitAttributes\": true,\r\n" + // - " \"joinCDATALines\": true,\r\n" + // - " \"formatComments\": true,\r\n" + // - " \"joinCommentLines\": true,\r\n" + // - " \"preserveAttributeLineBreaks\": true\r\n" + // - " },\r\n" + - " \"server\": {\r\n" + // - " \"workDir\": \"~/" + testFolder + "/Nested\"\r\n" + // - " },\r\n" + - " \"symbols\": {\r\n" + // - " \"enabled\": true,\r\n" + // - " \"excluded\": [\"**\\\\*.xsd\", \"**\\\\*.xml\"]\r\n" + // - " }\r\n" + - " }\r\n" + - " },\r\n" + - " \"extendedClientCapabilities\": {\r\n" + - " \"codeLens\": {\r\n" + - " \"codeLensKind\": {\r\n" + - " \"valueSet\": [\r\n" + - " \"references\"\r\n" + - " ]\r\n" + - " }\r\n" + - " },\r\n" + - " actionableNotificationSupport: true,\r\n" + - " openSettingsCommandSupport: true\r\n" + - " }" + - "}"; + " \"xml\": {\r\n" + " \"fileAssociations\": [\r\n" + // + " {\r\n" + // + " \"systemId\": \"src\\\\test\\\\resources\\\\xsd\\\\spring-beans-3.0.xsd\",\r\n" + // + " \"pattern\": \"**/test*.xml\"\r\n" + // + " },\r\n" + // + " {\r\n" + // + " \"systemId\": \"src\\\\test\\\\resources\\\\xsd\\\\projectDescription.xsd\",\r\n" + // + " \"pattern\": \"projectDescription.xml\"\r\n" + // + " }\r\n" + // + " ],\r\n" + // + " \"catalogs\": [\r\n" + // + " \"src\\\\test\\\\resources\\\\catalogs\\\\catalog.xml\"\r\n" + // + " ],\r\n" + // + " \"validation\": {\r\n" + // + " \"enabled\": true,\r\n" + // + " \"schema\": {\r\n" + // + " \"enabled\": \"never\"\r\n" + // + " }\r\n" + // + " },\r\n" + // + // Client (commons) settings + " \"format\": {\r\n" + // + " \"tabSize\": 10,\r\n" + // + " \"insertSpaces\": false,\r\n" + // + " \"splitAttributes\": true,\r\n" + // + " \"joinCDATALines\": true,\r\n" + // + " \"formatComments\": true,\r\n" + // + " \"joinCommentLines\": true,\r\n" + // + " \"preserveAttributeLineBreaks\": true\r\n" + // + " },\r\n" + " \"server\": {\r\n" + // + " \"workDir\": \"~/" + testFolder + "/Nested\"\r\n" + // + " },\r\n" + " \"symbols\": {\r\n" + // + " \"enabled\": true,\r\n" + // + " \"excluded\": [\"**\\\\*.xsd\", \"**\\\\*.xml\"]\r\n" + // + " }\r\n" + " }\r\n" + " },\r\n" + " \"extendedClientCapabilities\": {\r\n" + + " \"codeLens\": {\r\n" + " \"codeLensKind\": {\r\n" + " \"valueSet\": [\r\n" + + " \"references\"\r\n" + " ]\r\n" + " }\r\n" + " },\r\n" + + " actionableNotificationSupport: true,\r\n" + " openSettingsCommandSupport: true\r\n" + " }" + + "}"; // @formatter:on @Test @@ -120,13 +109,15 @@ public void initializationOptionsSettings() { // Test client commons settings initializationOptionsSettings = AllXMLSettings.getAllXMLSettings(initializationOptionsSettings); - XMLGeneralClientSettings settings = XMLGeneralClientSettings.getGeneralXMLSettings(initializationOptionsSettings); + XMLGeneralClientSettings settings = XMLGeneralClientSettings + .getGeneralXMLSettings(initializationOptionsSettings); assertNotNull(settings); // Server assertEquals("~/" + testFolder + "/Nested", settings.getServer().getWorkDir()); // Test content model extension settings - ContentModelSettings cmSettings = ContentModelSettings.getContentModelXMLSettings(initializationOptionsSettings); + ContentModelSettings cmSettings = ContentModelSettings + .getContentModelXMLSettings(initializationOptionsSettings); assertNotNull(cmSettings); // Catalog assertNotNull(cmSettings.getCatalogs()); @@ -135,16 +126,19 @@ public void initializationOptionsSettings() { // File associations assertNotNull(cmSettings.getFileAssociations()); assertEquals(2, cmSettings.getFileAssociations().length); - assertEquals("src\\test\\resources\\xsd\\spring-beans-3.0.xsd", cmSettings.getFileAssociations()[0].getSystemId()); + assertEquals("src\\test\\resources\\xsd\\spring-beans-3.0.xsd", + cmSettings.getFileAssociations()[0].getSystemId()); assertEquals("**/test*.xml", cmSettings.getFileAssociations()[0].getPattern()); // Diagnostics assertNotNull(cmSettings.getValidation()); assertEquals(true, cmSettings.getValidation().isEnabled()); - assertEquals(false, cmSettings.getValidation().isSchema()); + assertNotNull(cmSettings.getValidation().getSchema()); + assertNotNull(cmSettings.getValidation().getSchema().getEnabled()); + assertEquals(SchemaEnabled.never, cmSettings.getValidation().getSchema().getEnabled()); // Symbols assertNotNull(settings.getSymbols()); assertEquals(true, settings.getSymbols().isEnabled()); - assertArrayEquals(new String[]{"**\\*.xsd", "**\\*.xml"}, settings.getSymbols().getExcluded()); + assertArrayEquals(new String[] { "**\\*.xsd", "**\\*.xml" }, settings.getSymbols().getExcluded()); } @@ -177,7 +171,7 @@ public void formatSettings() { // the InitializeParams xmlFormattingOptions.merge(sharedXMLFormattingOptions); assertEquals(10, xmlFormattingOptions.getTabSize()); - assertTrue(xmlFormattingOptions.isInsertSpaces()); + assertTrue(xmlFormattingOptions.isInsertSpaces()); assertTrue(xmlFormattingOptions.isJoinCommentLines()); } @@ -216,7 +210,7 @@ public void cachePathSettings() { } catch (Exception e) { fail(); } finally { - //Reset static cache path + // Reset static cache path FilesUtils.setCachePathSetting(null); System.setProperty("user.home", originalUserHome); } @@ -224,7 +218,8 @@ public void cachePathSettings() { @Test public void symbolSettingsTest() { - //Tests that when the settings are updated the shared settings are also updated correctly + // Tests that when the settings are updated the shared settings are also updated + // correctly InitializeParams params = createInitializeParams(json); Object initializationOptionsSettings = InitializationOptionsSettings.getSettings(params); @@ -233,9 +228,10 @@ public void symbolSettingsTest() { XMLExcludedSymbolFile xsdFile = new XMLExcludedSymbolFile("**\\*.xsd"); XMLExcludedSymbolFile xmlFile = new XMLExcludedSymbolFile("**\\*.xml"); - XMLExcludedSymbolFile[] expectedExcludedFiles = new XMLExcludedSymbolFile[] {xsdFile, xmlFile}; + XMLExcludedSymbolFile[] expectedExcludedFiles = new XMLExcludedSymbolFile[] { xsdFile, xmlFile }; - XMLExcludedSymbolFile[] actualExpectedFiles = languageServer.getSettings().getSymbolSettings().getExcludedFiles(); + XMLExcludedSymbolFile[] actualExpectedFiles = languageServer.getSettings().getSymbolSettings() + .getExcludedFiles(); assertArrayEquals(expectedExcludedFiles, actualExpectedFiles); } @@ -249,8 +245,7 @@ public void extendedClientCapabilitiesTest() { assertNotNull(clientCapabilities.getCodeLens().getCodeLensKind()); assertNotNull(clientCapabilities.getCodeLens().getCodeLensKind().getValueSet()); assertEquals(1, clientCapabilities.getCodeLens().getCodeLensKind().getValueSet().size()); - assertEquals(CodeLensKind.References, - clientCapabilities.getCodeLens().getCodeLensKind().getValueSet().get(0)); + assertEquals(CodeLensKind.References, clientCapabilities.getCodeLens().getCodeLensKind().getValueSet().get(0)); assertTrue(clientCapabilities.isActionableNotificationSupport()); assertTrue(clientCapabilities.isOpenSettingsCommandSupport()); }