From 0411e6990db0fd0e6edaf5cdbd1e9ea2ea4ec144 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Mon, 16 Nov 2020 13:25:28 -0800 Subject: [PATCH] Some log output for xml resolver extension --- .../ProjectClasspathUriResolverExtension.java | 90 ++++++++++--------- .../vscode/xml/namespaces/util/Logger.java | 86 ++++++++++++++++++ 2 files changed, 134 insertions(+), 42 deletions(-) create mode 100644 headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/util/Logger.java diff --git a/headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/ProjectClasspathUriResolverExtension.java b/headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/ProjectClasspathUriResolverExtension.java index c325c56f0..ebed4d81e 100644 --- a/headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/ProjectClasspathUriResolverExtension.java +++ b/headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/ProjectClasspathUriResolverExtension.java @@ -29,6 +29,8 @@ import org.springframework.ide.vscode.xml.namespaces.util.DocumentAccessor; import org.springframework.ide.vscode.xml.namespaces.util.DocumentAccessor.SchemaLocations; import org.w3c.dom.Document; +import org.springframework.ide.vscode.xml.namespaces.util.Logger; + public class ProjectClasspathUriResolverExtension implements URIResolverExtension { private IJavaProjectProvider javaProjectProvider; @@ -69,50 +71,54 @@ public class ProjectClasspathUriResolverExtension implements URIResolverExtensio @Override public String resolve(String file, String publicId, String systemId) { - System.out.println("BaseLocation=" + file + " publicId=" + publicId + " systemId=" + systemId); - - // systemId is already resolved; so don't touch - if (systemId != null && systemId.startsWith("jar:")) { - return null; + Logger.DEFAULT.log("Resolve XML from classpath."); + Logger.DEFAULT.log("BaseLocation=" + file + " publicId=" + publicId + " systemId=" + systemId); + + // systemId is already resolved; so don't touch + if (systemId != null && systemId.startsWith("jar:")) { + return null; + } + + // identify the correct project + IJavaProjectData project = null; + + if (file != null) { + if (file.startsWith(ProjectAwareUrlStreamHandlerFactory.PROJECT_AWARE_PROTOCOL_HEADER)) { + String nameAndLocation = file + .substring(ProjectAwareUrlStreamHandlerFactory.PROJECT_AWARE_PROTOCOL_HEADER + .length()); + String projectName = nameAndLocation.substring(0, nameAndLocation.indexOf('/')); + project = javaProjectProvider.get(projectName); + } else { + project = getBestMatchingProject(file); } - - // identify the correct project - IJavaProjectData project = null; - - if (file != null) { - if (file.startsWith(ProjectAwareUrlStreamHandlerFactory.PROJECT_AWARE_PROTOCOL_HEADER)) { - String nameAndLocation = file - .substring(ProjectAwareUrlStreamHandlerFactory.PROJECT_AWARE_PROTOCOL_HEADER - .length()); - String projectName = nameAndLocation.substring(0, nameAndLocation.indexOf('/')); - project = javaProjectProvider.get(projectName); - } else { - project = getBestMatchingProject(file); - } - } - - if (project == null) { - return null; - } - - if (systemId == null && file != null) { - systemId = findSystemIdFromFile(file, publicId); - } - - if (systemId == null && publicId == null) { - return null; - } - - ProjectClasspathUriResolver resolver = getProjectResolver(file, project); - if (resolver != null) { - String resolved = resolver.resolveOnClasspath(publicId, systemId); - if (resolved != null) { - resolved = ProjectAwareUrlStreamHandlerFactory.createProjectAwareUrl(project.getName(), resolved); - } - return resolved; - } - + } + + if (project == null) { + Logger.DEFAULT.log("Resolve XML from classpath failed. No project."); + return null; + } + + if (systemId == null && file != null) { + systemId = findSystemIdFromFile(file, publicId); + } + if (systemId == null && publicId == null) { + Logger.DEFAULT.log("Resolve XML from classpath failed. No systemId && publicId."); + return null; + } + + ProjectClasspathUriResolver resolver = getProjectResolver(file, project); + if (resolver != null) { + String resolved = resolver.resolveOnClasspath(publicId, systemId); + if (resolved != null) { + resolved = ProjectAwareUrlStreamHandlerFactory.createProjectAwareUrl(project.getName(), resolved); + } + Logger.DEFAULT.log("Resolve XML from classpath => "+resolved); + return resolved; + } + + Logger.DEFAULT.log("Resolve XML from classpath failed. End of method"); return null; } diff --git a/headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/util/Logger.java b/headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/util/Logger.java new file mode 100644 index 000000000..6e4bad822 --- /dev/null +++ b/headless-services/xml-ls-extension/src/main/java/org/springframework/ide/vscode/xml/namespaces/util/Logger.java @@ -0,0 +1,86 @@ +package org.springframework.ide.vscode.xml.namespaces.util; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintWriter; +import java.util.Date; + + +/** + * Poor man's logger with a default implementation writes log output for jdt.ls extension into a predictable location. + */ +public interface Logger { + + public static class NullLogger implements Logger { + + @Override + public void log(String message) { + } + + @Override + public void log(Exception e) { + } + + } + public static Logger DEFAULT //pick one of the two below. Probably should use NullLogger in 'production'. + = new NullLogger(); + //= new DefaultLogger(false); + + public static class DefaultLogger implements Logger { + private PrintWriter printwriter; + public DefaultLogger(boolean USE_SYS_ERR) { + if (USE_SYS_ERR) { + printwriter = new PrintWriter(System.err); + } else { + File file = new File(System.getProperty("java.io.tmpdir")); + file = new File(file, "stsxmlls.log"); + try { + printwriter = new PrintWriter(new FileOutputStream(file), true); + log("======== "+new Date()+" ======="); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + @Override + public void log(String message) { + printwriter.println(message); + printwriter.flush(); + } + + @Override + public void log(Exception e) { + e.printStackTrace(printwriter); + } + } + + + public static class TestLogger extends DefaultLogger { + + private Exception firstError; + + public TestLogger() { + super(true); + } + + @Override + public void log(Exception e) { + super.log(e); + if (firstError!=null) { + firstError = e; + } + } + + public void assertNoErrors() throws Exception { + if (firstError!=null) { + throw firstError; + } + } + } + + void log(String message); + void log(Exception e); + +}