From 4e6d4163883388f0687a84c6d86f704b678dcd2b Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Wed, 16 Jan 2019 16:17:07 +0100 Subject: [PATCH] additional steps to make xml config analysis configurable, not yet complete through --- .../vscode/commons/util/text/LanguageId.java | 3 +- .../BootJavaLanguageServerComponents.java | 5 +- .../boot/java/utils/SpringIndexerXML.java | 73 ++++++++++--------- .../boot/java/utils/SpringSymbolIndex.java | 25 +++++-- 4 files changed, 63 insertions(+), 43 deletions(-) diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java index 68d2bb0da..b00469319 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2019 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -24,6 +24,7 @@ public class LanguageId { public static final LanguageId CF_MANIFEST = of("manifest-yaml"); public static final LanguageId JAVA = of("java"); public static final LanguageId YAML = of("yaml"); + public static final LanguageId XML = of("xml"); public static final LanguageId BOSH_DEPLOYMENT = of("bosh-deployment-manifest"); public static final LanguageId BOSH_CLOUD_CONFIG = of("bosh-cloud-config"); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java index 9d427f28a..29b70f23f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java @@ -91,7 +91,7 @@ import com.google.common.collect.ImmutableSet; */ public class BootJavaLanguageServerComponents implements LanguageServerComponents { - private static final Set LANGUAGES = ImmutableSet.of(LanguageId.JAVA); + private static final Set LANGUAGES = ImmutableSet.of(LanguageId.JAVA, LanguageId.XML); private static final Logger log = LoggerFactory.getLogger(BootJavaLanguageServerComponents.class); @@ -208,6 +208,9 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent liveHoverWatchdog.disableHighlights(); } + indexer.configureIndexer(config.isSpringXMLSupportEnabled()); + + // live change detection watchdog if (config.isChangeDetectionEnabled()) { liveChangeDetectionWatchdog.enableHighlights(); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java index 7674dd7cd..0d9321222 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.utils; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -69,6 +70,7 @@ public class SpringIndexerXML implements SpringIndexer { @Override public void updateFile(IJavaProject project, String docURI, String content) throws Exception { + scanFile(project, new ByteArrayInputStream(content.getBytes()), docURI); } private void scanProject(IJavaProject project, String[] files) { @@ -78,50 +80,51 @@ public class SpringIndexerXML implements SpringIndexer { } private void scanFile(IJavaProject project, String file) { - System.out.println("XML parsing for: " + file); try { - InputStream xmlInputStream = new FileInputStream(file); + String docURI = UriUtil.toUri(new File(file)).toString(); - XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - XMLEventReader eventReader = inputFactory.createXMLEventReader(xmlInputStream); - - while (eventReader.hasNext()) { - XMLEvent event = eventReader.nextEvent(); - switch (event.getEventType()) { - - case XMLEvent.START_ELEMENT: - StartElement startElement = event.asStartElement(); - - String namespaceURI = startElement.getName().getNamespaceURI(); - if (namespaceURI != null && this.namespaceHandler.containsKey(namespaceURI)) { - SpringIndexerXMLNamespaceHandler namespaceHandler = this.namespaceHandler.get(namespaceURI); - - String docURI = UriUtil.toUri(new File(file)).toString(); - namespaceHandler.processStartElement(project, docURI, startElement, this.handler); - } - - break; - - case XMLEvent.CHARACTERS: - Characters characters = event.asCharacters(); - System.out.print(characters.getData()); - break; - case XMLEvent.END_ELEMENT: - EndElement endElement = event.asEndElement(); - System.out.println(""); - break; - default: - // do nothing - break; - } - } + InputStream xmlInputStream = new FileInputStream(file); + scanFile(project, xmlInputStream, docURI); } catch (Exception e) { log.error("error parsing XML file: ", e); } + } + private void scanFile(IJavaProject project, InputStream xmlInput, String docURI) throws Exception { + XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + XMLEventReader eventReader = inputFactory.createXMLEventReader(xmlInput); + + while (eventReader.hasNext()) { + XMLEvent event = eventReader.nextEvent(); + switch (event.getEventType()) { + + case XMLEvent.START_ELEMENT: + StartElement startElement = event.asStartElement(); + + String namespaceURI = startElement.getName().getNamespaceURI(); + if (namespaceURI != null && this.namespaceHandler.containsKey(namespaceURI)) { + SpringIndexerXMLNamespaceHandler namespaceHandler = this.namespaceHandler.get(namespaceURI); + namespaceHandler.processStartElement(project, docURI, startElement, this.handler); + } + + break; + + case XMLEvent.CHARACTERS: + Characters characters = event.asCharacters(); + System.out.print(characters.getData()); + break; + case XMLEvent.END_ELEMENT: + EndElement endElement = event.asEndElement(); + System.out.println(""); + break; + default: + // do nothing + break; + } + } } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringSymbolIndex.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringSymbolIndex.java index d3a885132..240886a9a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringSymbolIndex.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringSymbolIndex.java @@ -70,7 +70,7 @@ public class SpringSymbolIndex { private final ConcurrentMap> addonInformationByProject; private final ExecutorService updateQueue; - private final SpringIndexer[] indexer; + private SpringIndexer[] indexer; private static final Logger log = LoggerFactory.getLogger(SpringSymbolIndex.class); @@ -93,6 +93,8 @@ public class SpringSymbolIndex { deleteProject(project); } }; + private SpringIndexerXML springIndexerXML; + private SpringIndexerJava springIndexerJava; private SimpleWorkspaceService getWorkspaceService() { return server.getServer().getWorkspaceService(); @@ -122,11 +124,12 @@ public class SpringSymbolIndex { } }; -// Map namespaceHandler = new HashMap<>(); -// namespaceHandler.put("http://www.springframework.org/schema/beans", new SpringIndexerXMLNamespaceHandlerBeans()); -// SpringIndexerXML springIndexerXML = new SpringIndexerXML(handler, namespaceHandler); -// this.indexer = new SpringIndexer[] {new SpringIndexerJava(handler, specificProviders), springIndexerXML }; - this.indexer = new SpringIndexer[] {new SpringIndexerJava(handler, specificProviders)}; + Map namespaceHandler = new HashMap<>(); + namespaceHandler.put("http://www.springframework.org/schema/beans", new SpringIndexerXMLNamespaceHandlerBeans()); + springIndexerXML = new SpringIndexerXML(handler, namespaceHandler); + springIndexerJava = new SpringIndexerJava(handler, specificProviders); + +// this.indexer = new SpringIndexer[] {springIndexerJava}; this.updateQueue = Executors.newSingleThreadExecutor(); @@ -167,6 +170,15 @@ public class SpringSymbolIndex { } } + public void configureIndexer(boolean springXMLSupportEnabled) { + if (springXMLSupportEnabled) { + this.indexer = new SpringIndexer[] {springIndexerJava, springIndexerXML}; + } + else { + this.indexer = new SpringIndexer[] {springIndexerJava}; + } + } + public CompletableFuture initializeProject(IJavaProject project) { try { if (SpringProjectUtil.isBootProject(project) || SpringProjectUtil.isSpringProject(project)) { @@ -178,6 +190,7 @@ public class SpringSymbolIndex { removeSymbolsByProject(project); + @SuppressWarnings("unchecked") CompletableFuture[] futures = new CompletableFuture[this.indexer.length]; for (int i = 0; i < this.indexer.length; i++) { InitializeProject initializeItem = new InitializeProject(project, this.indexer[i]);