MetricsConfiguration.java

  1. /*
  2.  *  Copyright (c) 2001-2024, Jean Tessier
  3.  *  All rights reserved.
  4.  *  
  5.  *  Redistribution and use in source and binary forms, with or without
  6.  *  modification, are permitted provided that the following conditions
  7.  *  are met:
  8.  *  
  9.  *      * Redistributions of source code must retain the above copyright
  10.  *        notice, this list of conditions and the following disclaimer.
  11.  *  
  12.  *      * Redistributions in binary form must reproduce the above copyright
  13.  *        notice, this list of conditions and the following disclaimer in the
  14.  *        documentation and/or other materials provided with the distribution.
  15.  *  
  16.  *      * Neither the name of Jean Tessier nor the names of his contributors
  17.  *        may be used to endorse or promote products derived from this software
  18.  *        without specific prior written permission.
  19.  *  
  20.  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21.  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22.  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23.  *  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR
  24.  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25.  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26.  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27.  *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28.  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29.  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30.  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  */

  32. package com.jeantessier.metrics;

  33. import com.jeantessier.text.MaximumCapacityPatternCache;
  34. import org.apache.oro.text.perl.Perl5Util;

  35. import java.util.Collection;
  36. import java.util.Collections;
  37. import java.util.HashMap;
  38. import java.util.HashSet;
  39. import java.util.LinkedList;
  40. import java.util.List;
  41. import java.util.Map;

  42. import static java.util.stream.Collectors.toCollection;

  43. public class MetricsConfiguration {
  44.     private static final Perl5Util perl = new Perl5Util(new MaximumCapacityPatternCache());
  45.    
  46.     private final List<MeasurementDescriptor> projectMeasurements = new LinkedList<>();
  47.     private final List<MeasurementDescriptor> groupMeasurements = new LinkedList<>();
  48.     private final List<MeasurementDescriptor> classMeasurements = new LinkedList<>();
  49.     private final List<MeasurementDescriptor> methodMeasurements = new LinkedList<>();
  50.     private final Map<String, Collection<String>> groupDefinitions = new HashMap<>();
  51.    
  52.     public List<MeasurementDescriptor> getProjectMeasurements() {
  53.         return Collections.unmodifiableList(projectMeasurements);
  54.     }

  55.     public void addProjectMeasurement(MeasurementDescriptor descriptor) {
  56.         projectMeasurements.add(descriptor);
  57.     }
  58.    
  59.     public List<MeasurementDescriptor> getGroupMeasurements() {
  60.         return Collections.unmodifiableList(groupMeasurements);
  61.     }

  62.     public void addGroupMeasurement(MeasurementDescriptor descriptor) {
  63.         groupMeasurements.add(descriptor);
  64.     }
  65.    
  66.     public List<MeasurementDescriptor> getClassMeasurements() {
  67.         return Collections.unmodifiableList(classMeasurements);
  68.     }

  69.     public void addClassMeasurement(MeasurementDescriptor descriptor) {
  70.         classMeasurements.add(descriptor);
  71.     }
  72.    
  73.     public List<MeasurementDescriptor> getMethodMeasurements() {
  74.         return Collections.unmodifiableList(methodMeasurements);
  75.     }

  76.     public void addMethodMeasurement(MeasurementDescriptor descriptor) {
  77.         methodMeasurements.add(descriptor);
  78.     }

  79.     public void addGroupDefinition(String name, String pattern) {
  80.         groupDefinitions.computeIfAbsent(name, k -> new LinkedList<>()).add(pattern);
  81.     }

  82.     public Collection<String> getGroups(String name) {
  83.         return groupDefinitions.entrySet().stream()
  84.                 .filter(entry -> entry.getValue().stream().anyMatch(pattern -> perl.match(pattern, name)))
  85.                 .map(Map.Entry::getKey)
  86.                 .collect(toCollection(HashSet::new));
  87.     }
  88. }