diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/XMLLanguageServer.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/XMLLanguageServer.java index fdf7a3ab3b..068ccebba3 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/XMLLanguageServer.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/XMLLanguageServer.java @@ -115,6 +115,7 @@ public CompletableFuture initialize(InitializeParams params) { this.parentProcessId = params.getProcessId(); + xmlLanguageService.setTelemetryManager(getTelemetryManager()); // Update XML language service extensions with InitializeParams xmlLanguageService.initializeParams(params); diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/ContentModelPlugin.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/ContentModelPlugin.java index be4a8d0d85..da2d83c8ce 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/ContentModelPlugin.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/ContentModelPlugin.java @@ -27,6 +27,7 @@ import org.eclipse.lemminx.extensions.contentmodel.participants.ContentModelHoverParticipant; import org.eclipse.lemminx.extensions.contentmodel.participants.ContentModelSymbolsProviderParticipant; import org.eclipse.lemminx.extensions.contentmodel.participants.ContentModelTypeDefinitionParticipant; +import org.eclipse.lemminx.extensions.contentmodel.participants.DocumentTelemetryParticipant; import org.eclipse.lemminx.extensions.contentmodel.participants.diagnostics.ContentModelDiagnosticsParticipant; import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings; import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings; @@ -80,6 +81,8 @@ public class ContentModelPlugin implements IXMLExtension { private XMLValidationSettings currentValidationSettings; + private DocumentTelemetryParticipant documentTelemetryParticipant; + public ContentModelPlugin() { completionParticipant = new ContentModelCompletionParticipant(); hoverParticipant = new ContentModelHoverParticipant(); @@ -184,6 +187,8 @@ public void start(InitializeParams params, XMLExtensionsRegistry registry) { symbolsProviderParticipant = new ContentModelSymbolsProviderParticipant(contentModelManager); registry.registerSymbolsProviderParticipant(symbolsProviderParticipant); registry.registerCodeLensParticipant(codeLensParticipant); + documentTelemetryParticipant = new DocumentTelemetryParticipant(registry.getTelemetryManager()); + registry.registerDocumentLifecycleParticipant(documentTelemetryParticipant); // Register custom commands to re-validate XML files IXMLCommandService commandService = registry.getCommandService(); @@ -211,6 +216,7 @@ public void stop(XMLExtensionsRegistry registry) { registry.unregisterTypeDefinitionParticipant(typeDefinitionParticipant); registry.unregisterSymbolsProviderParticipant(symbolsProviderParticipant); registry.unregisterCodeLensParticipant(codeLensParticipant); + registry.unregisterDocumentLifecycleParticipant(documentTelemetryParticipant); // Un-register custom commands to re-validate XML files IXMLCommandService commandService = registry.getCommandService(); diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/participants/DocumentTelemetryParticipant.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/participants/DocumentTelemetryParticipant.java new file mode 100644 index 0000000000..a268480cfa --- /dev/null +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/participants/DocumentTelemetryParticipant.java @@ -0,0 +1,42 @@ +/******************************************************************************* +* Copyright (c) 2021 Red Hat Inc. and others. +* All rights reserved. This program and the accompanying materials +* 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.participants; + +import org.eclipse.lemminx.dom.DOMDocument; +import org.eclipse.lemminx.services.extensions.IDocumentLifecycleParticipant; +import org.eclipse.lemminx.telemetry.TelemetryManager; + +public class DocumentTelemetryParticipant implements IDocumentLifecycleParticipant { + + private TelemetryManager telemetryManager; + + public DocumentTelemetryParticipant(TelemetryManager telemetryManager) { + this.telemetryManager = telemetryManager; + } + + @Override + public void didOpen(DOMDocument document) { + telemetryManager.onDidOpen(document); + } + + @Override + public void didChange(DOMDocument document) {} + + @Override + public void didSave(DOMDocument document) {} + + @Override + public void didClose(DOMDocument document) { + telemetryManager.onDidClose(document); + } + +} diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/XMLExtensionsRegistry.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/XMLExtensionsRegistry.java index 80369fca62..6cf516f3d6 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/XMLExtensionsRegistry.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/XMLExtensionsRegistry.java @@ -32,6 +32,7 @@ import org.eclipse.lemminx.services.extensions.format.IFormatterParticipant; import org.eclipse.lemminx.services.extensions.save.ISaveContext; import org.eclipse.lemminx.services.extensions.save.ISaveContext.SaveContextType; +import org.eclipse.lemminx.telemetry.TelemetryManager; import org.eclipse.lemminx.uriresolver.URIResolverExtensionManager; import org.eclipse.lsp4j.InitializeParams; @@ -74,6 +75,8 @@ public class XMLExtensionsRegistry implements IComponentProvider { private final Map, Object> components; + private TelemetryManager telemetryManager; + public XMLExtensionsRegistry() { extensions = new ArrayList<>(); completionParticipants = new ArrayList<>(); @@ -93,6 +96,7 @@ public XMLExtensionsRegistry() { documentLifecycleParticipants = new ArrayList<>(); resolverExtensionManager = new URIResolverExtensionManager(); components = new HashMap<>(); + telemetryManager = new TelemetryManager(null); registerComponent(resolverExtensionManager); } @@ -505,4 +509,12 @@ public void setCommandService(IXMLCommandService commandService) { this.commandService = commandService; } + public TelemetryManager getTelemetryManager() { + return telemetryManager; + } + + public void setTelemetryManager(TelemetryManager telemetryManager) { + this.telemetryManager = telemetryManager; + } + } \ No newline at end of file diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/telemetry/DocumentTelemetryInfo.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/telemetry/DocumentTelemetryInfo.java new file mode 100644 index 0000000000..43549f5c3e --- /dev/null +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/telemetry/DocumentTelemetryInfo.java @@ -0,0 +1,31 @@ +/******************************************************************************* +* Copyright (c) 2021 Red Hat Inc. and others. +* All rights reserved. This program and the accompanying materials +* 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.telemetry; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.lemminx.dom.DOMDocument; + +public class DocumentTelemetryInfo { + + private static final String DOC_PROP_EXT = "extension"; + + public static Map getDocumentTelemetryInfo (DOMDocument doc) { + String uri = doc.getDocumentURI(); + int index = uri.lastIndexOf('.'); + String fileExtension = uri.substring(index + 1, uri.length()); + HashMap props = new HashMap<>(); + props.put(DOC_PROP_EXT, fileExtension); + return props; + } +} diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/telemetry/TelemetryManager.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/telemetry/TelemetryManager.java index 5fe039d428..956239adf9 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/telemetry/TelemetryManager.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/telemetry/TelemetryManager.java @@ -9,6 +9,7 @@ *******************************************************************************/ package org.eclipse.lemminx.telemetry; +import org.eclipse.lemminx.dom.DOMDocument; import org.eclipse.lsp4j.InitializedParams; import org.eclipse.lsp4j.services.LanguageClient; @@ -24,6 +25,9 @@ public class TelemetryManager { */ private static final String STARTUP_EVENT_NAME = "server.initialized"; + private static final String DOC_OPEN_EVENT_NAME = "server.document.open"; + private static final String DOC_CLOSE_EVENT_NAME = "server.document.close"; + private final LanguageClient languageClient; private boolean enabled; @@ -51,6 +55,14 @@ public void onInitialized(InitializedParams params) { } } + public void onDidOpen(DOMDocument document) { + telemetryEvent(DOC_OPEN_EVENT_NAME, DocumentTelemetryInfo.getDocumentTelemetryInfo(document)); + } + + public void onDidClose(DOMDocument document) { + telemetryEvent(DOC_CLOSE_EVENT_NAME, DocumentTelemetryInfo.getDocumentTelemetryInfo(document)); + } + /** * The telemetry notification is sent from the server to the client to ask the * client to log a telemetry event.