diff --git a/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java b/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java
index d4cbd013c1f4..5ffdfb93dfad 100644
--- a/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java
+++ b/platform/platform-impl/src/com/intellij/featureStatistics/FeatureUsageTrackerImpl.java
@@ -1,6 +1,9 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.featureStatistics;
+import com.intellij.internal.statistic.eventLog.validator.ValidationResultType;
+import com.intellij.internal.statistic.eventLog.validator.rules.EventContext;
+import com.intellij.internal.statistic.eventLog.validator.rules.impl.CustomUtilsWhiteListRule;
import com.intellij.internal.statistic.persistence.UsageStatisticsPersistenceComponent;
import com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger;
import com.intellij.openapi.components.PersistentStateComponent;
@@ -12,6 +15,7 @@ import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Set;
@@ -188,4 +192,27 @@ public class FeatureUsageTrackerImpl extends FeatureUsageTracker implements Pers
}
}
+ public static class ProductivityUtilValidator extends CustomUtilsWhiteListRule {
+
+ @Override
+ public boolean acceptRuleId(@Nullable String ruleId) {
+ return "productivity".equals(ruleId);
+ }
+
+ @NotNull
+ @Override
+ protected ValidationResultType doValidate(@NotNull String data, @NotNull EventContext context) {
+ if ("third.party".equals(data)) return ValidationResultType.ACCEPTED;
+
+ final ProductivityFeaturesRegistry registry = ProductivityFeaturesRegistry.getInstance();
+ final FeatureDescriptor descriptor = registry.getFeatureDescriptor(data);
+ if (descriptor == null) {
+ return ValidationResultType.REJECTED;
+ }
+
+ final Class extends ProductivityFeaturesProvider> provider = descriptor.getProvider();
+ return provider == null || getPluginType(provider).isDevelopedByJetBrains() ?
+ ValidationResultType.ACCEPTED : ValidationResultType.REJECTED;
+ }
+ }
}
diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
index 0869446910a0..c8cefc8e78f0 100644
--- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml
+++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
@@ -410,6 +410,7 @@
+
diff --git a/platform/platform-tests/testSrc/com/intellij/internal/statistics/validator/FeatureUsageCustomValidatorsTest.kt b/platform/platform-tests/testSrc/com/intellij/internal/statistics/validator/FeatureUsageCustomValidatorsTest.kt
index a7661c9b73a1..0f0cdb21a803 100644
--- a/platform/platform-tests/testSrc/com/intellij/internal/statistics/validator/FeatureUsageCustomValidatorsTest.kt
+++ b/platform/platform-tests/testSrc/com/intellij/internal/statistics/validator/FeatureUsageCustomValidatorsTest.kt
@@ -1,6 +1,7 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.statistics.validator
+import com.intellij.featureStatistics.FeatureUsageTrackerImpl
import com.intellij.internal.statistic.collectors.fus.FacetTypeUsageCollector
import com.intellij.internal.statistic.eventLog.FeatureUsageData
import com.intellij.internal.statistic.eventLog.validator.ValidationResultType
@@ -58,4 +59,28 @@ class FeatureUsageCustomValidatorsTest : LightPlatformTestCase() {
Disposer.dispose(disposable)
}
}
+
+ @Test
+ fun `test validate welcome productivity feature`() {
+ val validator = FeatureUsageTrackerImpl.ProductivityUtilValidator()
+ doValidateEventId(validator, "features.welcome", FeatureUsageData())
+ }
+
+ @Test
+ fun `test validate third party productivity feature`() {
+ val validator = FeatureUsageTrackerImpl.ProductivityUtilValidator()
+ doValidateEventId(validator, "third.party", FeatureUsageData())
+ }
+
+ @Test
+ fun `test validate productivity feature by id`() {
+ val validator = FeatureUsageTrackerImpl.ProductivityUtilValidator()
+ doValidateEventId(validator, "navigation.popup.camelprefix", FeatureUsageData())
+ }
+
+ @Test
+ fun `test reject unknown productivity feature`() {
+ val validator = FeatureUsageTrackerImpl.ProductivityUtilValidator()
+ doRejectEventId(validator, "unknown.feature.id", FeatureUsageData())
+ }
}
\ No newline at end of file