Commit 77e3a064 authored by Anton Makeev's avatar Anton Makeev
Browse files

FUS-310 Improve File Type usage/editing statistics with file type schema: safer reported values

parent e68a51cf
Showing with 57 additions and 31 deletions
+57 -31
......@@ -4,15 +4,21 @@ package com.intellij.internal.statistic.collectors.fus.fileTypes;
import com.intellij.internal.statistic.eventLog.FeatureUsageData;
import com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger;
import com.intellij.internal.statistic.utils.StatisticsUtilKt;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.AbstractExtensionPointBean;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.LazyInstance;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.KeyedLazyInstanceEP;
import com.intellij.util.KeyedLazyInstance;
import com.intellij.util.xmlb.annotations.Attribute;
import org.jetbrains.annotations.NotNull;
public class FileTypeUsageCounterCollector {
private static final ExtensionPointName<KeyedLazyInstanceEP<FileTypeUsageSchemaDescriptor>> EP =
private static final Logger LOG = Logger.getInstance("#" + FileTypeUsageCounterCollector.class.getPackage().getName());
private static final ExtensionPointName<FileTypeUsageSchemaDescriptorEP<FileTypeUsageSchemaDescriptor>> EP =
ExtensionPointName.create("com.intellij.fileTypeUsageSchemaDescriptor");
public static void triggerEdit(@NotNull Project project, @NotNull VirtualFile file) {
......@@ -29,15 +35,15 @@ public class FileTypeUsageCounterCollector {
final FeatureUsageData data = new FeatureUsageData().addData("type", type);
FileType fileType = file.getFileType();
for (KeyedLazyInstanceEP<FileTypeUsageSchemaDescriptor> ext : EP.getExtensionList()) {
for (FileTypeUsageSchemaDescriptorEP<FileTypeUsageSchemaDescriptor> ext : EP.getExtensionList()) {
FileTypeUsageSchemaDescriptor instance = ext.getInstance();
if (ext.schema == null) {
LOG.warn("Extension " + ext.implementationClass + " should define a 'schema' attribute");
continue;
}
String schema = instance.describeSchema(file);
if (schema != null) {
if (!StatisticsUtilKt.getPluginType(instance.getClass()).isDevelopedByJetBrains()) {
schema = "third.party";
}
data.addData("schema", schema);
if (instance.describes(file)) {
data.addData("schema", StatisticsUtilKt.getPluginType(instance.getClass()).isSafeToReport() ? ext.schema : "third.party");
break;
}
}
......@@ -45,4 +51,31 @@ public class FileTypeUsageCounterCollector {
final String id = FileTypeUsagesCollector.toReportedId(fileType, data);
FUCounterUsageLogger.getInstance().logEvent(project, "file.types.usage", id, data);
}
public static class FileTypeUsageSchemaDescriptorEP<T> extends AbstractExtensionPointBean implements KeyedLazyInstance<T> {
// these must be public for scrambling compatibility
@Attribute("schema")
public String schema;
@Attribute("implementationClass")
public String implementationClass;
private final LazyInstance<T> myHandler = new LazyInstance<T>() {
@Override
protected Class<T> getInstanceClass() throws ClassNotFoundException {
return findClass(implementationClass);
}
};
@NotNull
@Override
public T getInstance() {
return myHandler.getValue();
}
@Override
public String getKey() {
return schema;
}
}
}
......@@ -3,14 +3,13 @@ package com.intellij.internal.statistic.collectors.fus.fileTypes;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface FileTypeUsageSchemaDescriptor {
/**
* Used to categorise file types usage statistics.
* If the file has some generic file type (e.g. XML), this method allow specifying the 'schema' more precisely,
* e.g `Maven` or `Spring`.
* Is used to categorise file types usage statistics.
* If a file has some generic file type (e.g. XML), this method allow specifying its 'schema' more precisely, e.g `Maven` or `Spring`.
*
* @return true if the given file has the schema name, given in the `schema` attribute of the `FileTypeUsageSchemaDescriptor` extension.
*/
@Nullable
String describeSchema(@NotNull VirtualFile file);
boolean describes(@NotNull VirtualFile file);
}
......@@ -48,7 +48,7 @@
interface="com.intellij.openapi.fileTypes.FileTypeFactory"/>
<extensionPoint name="fileTypeUsageSchemaDescriptor"
beanClass="com.intellij.util.KeyedLazyInstanceEP">
beanClass="com.intellij.internal.statistic.collectors.fus.fileTypes.FileTypeUsageCounterCollector$FileTypeUsageSchemaDescriptorEP">
<with attribute="implementationClass" implements="com.intellij.internal.statistic.collectors.fus.fileTypes.FileTypeUsageSchemaDescriptor"/>
</extensionPoint>
......
......@@ -50,7 +50,7 @@
<runLineMarkerContributor language="Groovy" id="gradleGroovyRunLineMarkerProvider"
implementationClass="org.jetbrains.plugins.gradle.execution.GradleGroovyRunLineMarkerProvider"/>
<fileTypeUsageSchemaDescriptor implementationClass="org.jetbrains.plugins.gradle.config.GradleScriptTypeDetector"/>
<fileTypeUsageSchemaDescriptor schema="Gradle" implementationClass="org.jetbrains.plugins.gradle.config.GradleScriptTypeDetector"/>
</extensions>
<extensions defaultExtensionNs="org.intellij.groovy">
......
......@@ -18,7 +18,6 @@ package org.jetbrains.plugins.gradle.config;
import com.intellij.internal.statistic.collectors.fus.fileTypes.FileTypeUsageSchemaDescriptor;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.gradle.util.GradleConstants;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector;
......@@ -37,11 +36,10 @@ public class GradleScriptTypeDetector extends GroovyScriptTypeDetector implement
return GradleConstants.EXTENSION.equals(script.getViewProvider().getVirtualFile().getExtension());
}
@Nullable
@Override
public String describeSchema(@NotNull VirtualFile file) {
public boolean describes(@NotNull VirtualFile file) {
String name = file.getName();
return file.getFileType() == GroovyFileType.GROOVY_FILE_TYPE &&
(name.equals(GradleConstants.DEFAULT_SCRIPT_NAME) || name.equals(GradleConstants.SETTINGS_FILE_NAME)) ? "Gradle" : null;
(name.equals(GradleConstants.DEFAULT_SCRIPT_NAME) || name.equals(GradleConstants.SETTINGS_FILE_NAME));
}
}
......@@ -18,7 +18,6 @@ package org.jetbrains.idea.maven.plugins.groovy;
import com.intellij.internal.statistic.collectors.fus.fileTypes.FileTypeUsageSchemaDescriptor;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
......@@ -36,10 +35,9 @@ public class MavenGroovyScriptTypeDetector extends GroovyScriptTypeDetector impl
return isMavenGroovyScript(script.getViewProvider().getVirtualFile());
}
@Nullable
@Override
public String describeSchema(@NotNull VirtualFile file) {
return isMavenGroovyScript(file) ? "Maven Groovy" : null;
public boolean describes(@NotNull VirtualFile file) {
return isMavenGroovyScript(file);
}
private static boolean isMavenGroovyScript(@NotNull VirtualFile file) {
......
......@@ -23,7 +23,6 @@ import com.intellij.openapi.fileTypes.FileTypeFactory;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.model.MavenConstants;
/**
......@@ -36,9 +35,8 @@ public class MavenFileTypeFactory extends FileTypeFactory implements FileTypeUsa
consumer.consume(XmlFileType.INSTANCE, MavenConstants.POM_EXTENSION);
}
@Nullable
@Override
public String describeSchema(@NotNull VirtualFile file) {
return file.getFileType() == XmlFileType.INSTANCE && FileUtil.namesEqual(file.getName(), MavenConstants.POM_XML) ? "Maven" : null;
public boolean describes(@NotNull VirtualFile file) {
return file.getFileType() == XmlFileType.INSTANCE && FileUtil.namesEqual(file.getName(), MavenConstants.POM_XML);
}
}
......@@ -31,6 +31,6 @@
<completion.contributor language="Groovy" id="mavenGroovyPom" order="last"
implementationClass="org.jetbrains.idea.maven.plugins.groovy.MavenGroovyPomCompletionContributor"/>
<fileTypeUsageSchemaDescriptor implementationClass="org.jetbrains.idea.maven.plugins.groovy.MavenGroovyScriptTypeDetector"/>
<fileTypeUsageSchemaDescriptor schema="Maven Groovy" implementationClass="org.jetbrains.idea.maven.plugins.groovy.MavenGroovyScriptTypeDetector"/>
</extensions>
</idea-plugin>
\ No newline at end of file
......@@ -41,7 +41,7 @@
<applicationInitializedListener implementation="org.jetbrains.idea.maven.utils.MavenEnvironmentRegistrar"/>
<customJavadocTagProvider implementation="org.jetbrains.idea.maven.javadoc.MojoClassAnnotationTagProvider"/>
<fileTypeFactory implementation="org.jetbrains.idea.maven.utils.MavenFileTypeFactory"/>
<fileTypeUsageSchemaDescriptor implementationClass="org.jetbrains.idea.maven.utils.MavenFileTypeFactory"/>
<fileTypeUsageSchemaDescriptor schema="Maven" implementationClass="org.jetbrains.idea.maven.utils.MavenFileTypeFactory"/>
<projectImportProvider implementation="org.jetbrains.idea.maven.wizards.MavenProjectImportProvider"/>
<projectOpenProcessor implementation="org.jetbrains.idea.maven.wizards.MavenProjectOpenProcessor"/>
<projectImportBuilder implementation="org.jetbrains.idea.maven.wizards.MavenProjectBuilder"/>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment