blob: 7fdc89f3deae90ecc85f2e880313e0fbe483cf10 [file] [log] [blame]
/*
* Copyright 2000-2009 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.featureStatistics;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ArrayUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class FeatureDescriptor{
@NotNull private String myId;
private String myGroupId;
@NotNull private String myTipFileName;
@NotNull private String myDisplayName;
private int myDaysBeforeFirstShowUp;
private int myDaysBetweenSuccesiveShowUps;
private Set<String> myDependencies;
private int myMinUsageCount;
private int myUsageCount;
private long myLastTimeShown;
private long myLastTimeUsed;
private int myShownCount;
private ProductivityFeaturesProvider myProvider;
@NonNls private static final String ATTRIBUTE_COUNT = "count";
@NonNls private static final String ATTRIBUTE_LAST_SHOWN = "last-shown";
@NonNls private static final String ATTRIBUTE_LAST_USED = "last-used";
@NonNls private static final String ATTRIBUTE_SHOWN_COUNT = "shown-count";
@NonNls private static final String ATTRIBUTE_ID = "id";
@NonNls private static final String ATTRIBUTE_TIP_FILE = "tip-file";
@NonNls private static final String ATTRIBUTE_FIRST_SHOW = "first-show";
@NonNls private static final String ATTRIBUTE_SUCCESSIVE_SHOW = "successive-show";
@NonNls private static final String ATTRIBUTE_MIN_USAGE_COUNT = "min-usage-count";
@NonNls private static final String ELEMENT_DEPENDENCY = "dependency";
FeatureDescriptor(GroupDescriptor group) {
myGroupId = group.getId();
}
FeatureDescriptor(final String id) {
myId = id;
}
FeatureDescriptor(String id, @NonNls String tipFileName, String displayName) {
myId = id;
myTipFileName = tipFileName;
myDisplayName = displayName;
}
public FeatureDescriptor(@NonNls String id,
@NonNls String groupId,
@NonNls String tipFileName,
String displayName,
int daysBeforeFirstShowUp,
int daysBetweenSuccessiveShowUps,
Set<String> dependencies,
int minUsageCount,
ProductivityFeaturesProvider provider) {
myId = id;
myGroupId = groupId;
myTipFileName = tipFileName;
myDisplayName = displayName;
myDaysBeforeFirstShowUp = daysBeforeFirstShowUp;
myDaysBetweenSuccesiveShowUps = daysBetweenSuccessiveShowUps;
myDependencies = dependencies;
myMinUsageCount = minUsageCount;
myProvider = provider;
}
void readExternal(Element element) {
myId = element.getAttributeValue(ATTRIBUTE_ID);
myTipFileName = element.getAttributeValue(ATTRIBUTE_TIP_FILE);
myDisplayName = FeatureStatisticsBundle.message(myId);
myDaysBeforeFirstShowUp = StringUtil.parseInt(element.getAttributeValue(ATTRIBUTE_FIRST_SHOW), 1);
myDaysBetweenSuccesiveShowUps = StringUtil.parseInt(element.getAttributeValue(ATTRIBUTE_SUCCESSIVE_SHOW), 3);
String minUsageCount = element.getAttributeValue(ATTRIBUTE_MIN_USAGE_COUNT);
myMinUsageCount = minUsageCount == null ? 1 : Integer.parseInt(minUsageCount);
List dependencies = element.getChildren(ELEMENT_DEPENDENCY);
if (dependencies != null && !dependencies.isEmpty()) {
myDependencies = new HashSet<String>();
for (Object dependency : dependencies) {
Element dependencyElement = (Element)dependency;
myDependencies.add(dependencyElement.getAttributeValue(ATTRIBUTE_ID));
}
}
}
@NotNull
public String getId() {
return myId;
}
public String getGroupId() {
return myGroupId;
}
@NotNull
public String getTipFileName() {
return myTipFileName;
}
@NotNull
public String getDisplayName() {
return myDisplayName;
}
public int getUsageCount() {
return myUsageCount;
}
public Class<? extends ProductivityFeaturesProvider> getProvider() {
if (myProvider == null){
return null;
}
return myProvider.getClass();
}
void triggerUsed() {
long current = System.currentTimeMillis();
long delta = myUsageCount > 0 ? current - Math.max(myLastTimeUsed, ApplicationManager.getApplication().getStartTime()) : 0;
myLastTimeUsed = current;
myUsageCount++;
}
public boolean isUnused() {
return myUsageCount < myMinUsageCount;
}
public String toString() {
@NonNls StringBuilder buffer = new StringBuilder();
buffer.append("id = [");
buffer.append(myId);
buffer.append("], displayName = [");
buffer.append(myDisplayName);
buffer.append("], groupId = [");
buffer.append(myGroupId);
buffer.append("], usageCount = [");
buffer.append(myUsageCount);
buffer.append("]");
return buffer.toString();
}
public int getDaysBeforeFirstShowUp() {
return myDaysBeforeFirstShowUp;
}
public int getDaysBetweenSuccesiveShowUps() {
return myDaysBetweenSuccesiveShowUps;
}
public int getMinUsageCount() {
return myMinUsageCount;
}
public long getLastTimeShown() {
return myLastTimeShown;
}
public String[] getDependencyFeatures() {
if (myDependencies == null) return ArrayUtil.EMPTY_STRING_ARRAY;
return ArrayUtil.toStringArray(myDependencies);
}
void triggerShown() {
myLastTimeShown = System.currentTimeMillis();
myShownCount++;
}
public long getLastTimeUsed() {
return myLastTimeUsed;
}
public int getShownCount() {
return myShownCount;
}
void copyStatistics(FeatureDescriptor statistics){
myUsageCount = statistics.getUsageCount();
myLastTimeShown = statistics.getLastTimeShown();
myLastTimeUsed = statistics.getLastTimeUsed();
myShownCount = statistics.getShownCount();
}
void readStatistics(Element element) {
String count = element.getAttributeValue(ATTRIBUTE_COUNT);
String lastShown = element.getAttributeValue(ATTRIBUTE_LAST_SHOWN);
String lastUsed = element.getAttributeValue(ATTRIBUTE_LAST_USED);
String shownCount = element.getAttributeValue(ATTRIBUTE_SHOWN_COUNT);
myUsageCount = count == null ? 0 : Integer.parseInt(count);
myLastTimeShown = lastShown == null ? 0 : Long.parseLong(lastShown);
myLastTimeUsed = lastUsed == null ? 0 : Long.parseLong(lastUsed);
myShownCount = shownCount == null ? 0 : Integer.parseInt(shownCount);
}
void writeStatistics(Element element) {
element.setAttribute(ATTRIBUTE_COUNT, String.valueOf(getUsageCount()));
element.setAttribute(ATTRIBUTE_LAST_SHOWN, String.valueOf(getLastTimeShown()));
element.setAttribute(ATTRIBUTE_LAST_USED, String.valueOf(getLastTimeUsed()));
element.setAttribute(ATTRIBUTE_SHOWN_COUNT, String.valueOf(getShownCount()));
}
}