blob: 2873ed3a222ad21e4fd69af43fc3c509b587b7ad [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.internal.statistic.ideSettings;
import com.intellij.internal.statistic.beans.GroupDescriptor;
import com.intellij.internal.statistic.beans.UsageDescriptor;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ReflectionUtil;
import com.intellij.util.containers.hash.HashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Set;
public class IdeSettingsStatisticsUtils {
public static final GroupDescriptor GROUP = GroupDescriptor.create("IDE Settings", GroupDescriptor.HIGHER_PRIORITY);
@Nullable
public static Object getApplicationProvider(@NotNull String providerName) {
return getProviderInstance(getApplicationComponentByName(providerName));
}
public static Set<UsageDescriptor> getUsages(@NotNull IdeSettingsDescriptor descriptor, @NotNull Object componentInstance) {
Set<UsageDescriptor> descriptors = new HashSet<UsageDescriptor>();
String providerName = descriptor.myProviderName;
List<String> propertyNames = descriptor.getPropertyNames();
if (providerName != null && propertyNames.size() > 0) {
for (String propertyName : propertyNames) {
Object propertyValue = getPropertyValue(componentInstance, propertyName);
if (propertyValue != null) {
descriptors.add(new UsageDescriptor(getUsageDescriptorKey(providerName, propertyName, propertyValue.toString()), 1));
}
}
}
return descriptors;
}
@Nullable
private static Object getPropertyValue(Object componentInstance, String propertyName) {
final Class<? extends Object> componentInstanceClass = componentInstance.getClass();
Object propertyValue = ReflectionUtil.getField(componentInstanceClass, componentInstance, null, propertyName);
if (propertyValue == null) {
Method method = ReflectionUtil.getMethod(componentInstanceClass, "get" + StringUtil.capitalize(propertyName));
if (method == null) {
method = ReflectionUtil.getMethod(componentInstanceClass, "is" + StringUtil.capitalize(propertyName));
}
if (method != null) {
try {
propertyValue = method.invoke(componentInstance);
}
catch (Exception ignored) {
}
}
}
return propertyValue;
}
private static String getUsageDescriptorKey(@NotNull String providerName, @NotNull String name, @NotNull String value) {
final String shortName = StringUtil.getShortName(providerName);
return shortName + "#" + name + "(" + value + ")";
}
@Nullable
public static Object getProjectProvider(@Nullable Project project,
@NotNull String providerName) {
return getProviderInstance(getProjectComponentByName(project, providerName));
}
@Nullable
private static Object getProviderInstance(Object componentInstance) {
if (componentInstance instanceof PersistentStateComponent) {
return ((PersistentStateComponent)componentInstance).getState();
}
return componentInstance;
}
@Nullable
private static Object getApplicationComponentByName(@NotNull String providerName) {
return ApplicationManager.getApplication().getPicoContainer().getComponentInstance(providerName);
}
@Nullable
private static Object getProjectComponentByName(@Nullable Project project, String providerName) {
if (project != null) {
return project.getPicoContainer().getComponentInstance(providerName);
}
return null;
}
}