additional steps to make xml config analysis configurable, not yet complete through

This commit is contained in:
Martin Lippert
2019-01-16 16:17:07 +01:00
parent 4f7a2014c4
commit 4e6d416388
4 changed files with 63 additions and 43 deletions

View File

@@ -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");

View File

@@ -91,7 +91,7 @@ import com.google.common.collect.ImmutableSet;
*/
public class BootJavaLanguageServerComponents implements LanguageServerComponents {
private static final Set<LanguageId> LANGUAGES = ImmutableSet.of(LanguageId.JAVA);
private static final Set<LanguageId> 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();

View File

@@ -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("</" + endElement.getName().toString() + ">");
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("</" + endElement.getName().toString() + ">");
break;
default:
// do nothing
break;
}
}
}
}

View File

@@ -70,7 +70,7 @@ public class SpringSymbolIndex {
private final ConcurrentMap<String, List<SymbolAddOnInformation>> 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<String, SpringIndexerXMLNamespaceHandler> 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<String, SpringIndexerXMLNamespaceHandler> 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<Void> initializeProject(IJavaProject project) {
try {
if (SpringProjectUtil.isBootProject(project) || SpringProjectUtil.isSpringProject(project)) {
@@ -178,6 +190,7 @@ public class SpringSymbolIndex {
removeSymbolsByProject(project);
@SuppressWarnings("unchecked")
CompletableFuture<Void>[] futures = new CompletableFuture[this.indexer.length];
for (int i = 0; i < this.indexer.length; i++) {
InitializeProject initializeItem = new InitializeProject(project, this.indexer[i]);