/* * Copyright 2005-2016 Sixth and Red River Software, Bas Leijdekkers * * 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.sixrr.metrics; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.*; /** * The PrebuiltMetricProfile class represents a pre-build set of metrics and thresholds which a metrics plugin may install * into IntelliJ IDEA. Prebuilt profiles may make it easier for end-users to learn the metrics available, and how they * interact. */ public class PrebuiltMetricProfile { private final String profileName; private final Set<String> metricNames = new HashSet<String>(); private final Map<String, Double> lowerThresholds = new HashMap<String, Double>(); private final Map<String, Double> upperThresholds = new HashMap<String, Double>(); /** * Create a prebuilt metric profile. * * @param profileName the name of the profile. */ public PrebuiltMetricProfile(@NotNull String profileName) { this.profileName = profileName; } public void addMetric(@NotNull Class<? extends Metric> metricClass) { addMetric(metricClass, null, null); } public void addMetric(@NotNull Class<? extends Metric> metricClass, Double lowerThreshold, Double upperThreshold) { addMetric(calculateName(metricClass), lowerThreshold, upperThreshold); } /** * Add a metric to the profile, with no upper or lower threshold specified. * This is equivalent to add(metricID, null, null) * * @param metricID the ID of the metric to add. */ public void addMetric(@NotNull @NonNls String metricID) { addMetric(metricID, null, null); } /** * Add a metric to the profile, optionally specifying upper and lower thresholds for the metrics acceptable. * * @param metricID the ID of the metric to add. * @param lowerThreshold The lower threshold of acceptable values for the metric, or null if there isn't any. * @param upperThreshold The upper threshold of acceptable values for the metric, or null if there isn't any. */ public void addMetric(@NotNull @NonNls String metricID, Double lowerThreshold, Double upperThreshold) { metricNames.add(metricID); if (lowerThreshold != null) { lowerThresholds.put(metricID, lowerThreshold); } if (upperThreshold != null) { upperThresholds.put(metricID, upperThreshold); } } /** * Get the name of the profile. * * @return the name of the profile */ public String getProfileName() { return profileName; } /** * Get the ids of the metrics which have been added to the profile. * * @return the metric ids for the profile. */ public Set<String> getMetricIDs() { return Collections.unmodifiableSet(metricNames); } /** * Get the lower threshold for a metric in the profile, or null if there is no lower threshold specified. * * @param id the id of the metric. * @return the lower threshold of acceptable values for the metric, or null if there isn't any. */ public Double getLowerThresholdForMetric(String id) { return lowerThresholds.get(id); } /** * Get the upper threshold for a metric in the profile, or null if there is no upper threshold specified. * * @param id the id of the metric. * @return the upper threshold of acceptable values for the metric, or null if there isn't any. */ public Double getUpperThresholdForMetric(String id) { return upperThresholds.get(id); } private static String calculateName(@NotNull Class<? extends Metric> metricClass) { final String className = metricClass.getSimpleName(); if (!className.endsWith("Metric")) { throw new IllegalArgumentException("class name must end with Metric"); } @NonNls final int endIndex = className.length() - "Metric".length(); return className.substring(0, endIndex); } }