/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.uff.ic.oceano.core.tools.metrics.extractors.dependometer.util;
import br.uff.ic.oceano.core.tools.metrics.MetricEnumeration;
import br.uff.ic.oceano.core.model.Metric;
import br.uff.ic.oceano.core.tools.metrics.extractors.dependometer.DependometerException;
import com.valtech.source.dependometer.app.core.common.MetricEnum;
import com.valtech.source.dependometer.app.core.metrics.MetricDefinition;
import static com.valtech.source.dependometer.app.core.provider.MetricDefinitionIf.TYPE_NUMBER;
import com.valtech.source.dependometer.app.core.provider.MetricIf;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
/**
* Helper class to translate Dependometer metrics to/from Oceano.
*
* @author daniel heráclio
*/
public class MetricHelper {
private static List<MetricEnum> projectMetrics;
private static List<MetricEnum> layerMetrics;
private static List<MetricEnum> subsystemMetrics;
private static List<MetricEnum> verticalSliceMetrics;
private static List<MetricEnum> packageMetrics;
private static List<MetricEnum> compilationUnitMetrics;
private static List<MetricEnum> typeMetrics;
private static List<MetricEnum> canBeProjectMetrics;
private static List<MetricEnum> notImplementedMetrics;
private static EnumMap<MetricEnumeration, MetricEnum> oceano2dependometer;
static {
initDependometerMetricTargets();
initMapping();
initCalculable();
}
public static MetricEnumeration getOceanoMetric(final MetricEnum dependometer) throws DependometerException {
Iterator<Entry<MetricEnumeration, MetricEnum>> it = oceano2dependometer.entrySet().iterator();
while (it.hasNext()) {
Entry<MetricEnumeration, MetricEnum> pair = it.next();
if (pair.getValue().equals(dependometer)) {
return pair.getKey();
}
}
return null;
}
public static MetricEnum getDependometerMetric(final MetricEnumeration oceano) throws DependometerException {
return oceano2dependometer.get(oceano);
}
private static void initMapping() {
oceano2dependometer = new EnumMap<MetricEnumeration, MetricEnum>(MetricEnumeration.class);
//oceano metrics to dependometer metrics
//Project metrics
//project to project
oceano2dependometer.put(MetricEnumeration.DSC, MetricEnum.NUMBER_OF_TYPES);
//ANA (QMOOD.METRIC_AVERAGE_NUMBER_OF_ANCESTORS)
//needs to be calculated
oceano2dependometer.put(MetricEnumeration.ANA, MetricEnum.DEPTH_OF_CLASS_INHERITANCE);
//NOH (QMOOD.METRIC_NUMBER_OF_HIERARCHIES)
//needs to be calculated
oceano2dependometer.put(MetricEnumeration.NOH, MetricEnum.DEPTH_OF_CLASS_INHERITANCE);
//Package metrics
//package to package
oceano2dependometer.put(MetricEnumeration.RMA, MetricEnum.ABSTRACTNESS);
//File metrics
//file to CompilationUnit (also package, layer, subsystem)
oceano2dependometer.put(MetricEnumeration.DCC, MetricEnum.DEPENDS_UPON);
//no mapping
//CIS(QMOOD.METRIC_CLASS_INTERFACE_SIZE)- MetricEnum.Interface is boolean
//CAM(QMOOD.METRIC_COHESION_AMONG_METHODS_IN_CLASS) -
//ACC("Cyclomatic Complexity")
}
private static void initCalculable() {
canBeProjectMetrics = new LinkedList<MetricEnum>();
//adding compilation units number of types
canBeProjectMetrics.add(MetricEnum.NUMBER_OF_TYPES);
//average of DepthOfClassInheritance is the same of MetricEnumeration.ANA
canBeProjectMetrics.add(MetricEnum.DEPTH_OF_CLASS_INHERITANCE);
}
public static boolean isPackageMetric(MetricEnum mEnum) {
return packageMetrics.contains(mEnum);
}
public static boolean isProjectMetric(MetricEnum mEnum) {
return projectMetrics.contains(mEnum);
}
/**
* Metrics which can be calculated for the hole project but aren't by
* dependometer
*
* @param metricEnum
* @return
*/
public static boolean canBeProjectMetric(MetricEnum metricEnum) {
return canBeProjectMetrics.contains(metricEnum);
}
public static boolean isImplemented(MetricEnum mEnum) {
return !notImplementedMetrics.contains(mEnum);
}
public static boolean isSubsystemMetric(MetricEnum mEnum) {
return subsystemMetrics.contains(mEnum);
}
public static boolean isVerticalSliceMetric(MetricEnum mEnum) {
return verticalSliceMetrics.contains(mEnum);
}
public static boolean isLayerMetric(MetricEnum mEnum) {
return layerMetrics.contains(mEnum);
}
public static boolean isTypeMetric(MetricEnum mEnum) {
return typeMetrics.contains(mEnum);
}
public static boolean isCompilationUnitMetric(MetricEnum mEnum) {
return compilationUnitMetrics.contains(mEnum);
}
private static void initDependometerMetricTargets() {
//dependometer documentation is confusing and flawed
//metrics extrated from test dependometerServices
// <editor-fold defaultstate="collapsed" desc="Project metrics">
projectMetrics = new LinkedList<MetricEnum>();
projectMetrics.add(MetricEnum.AVERAGE_COMPONENT_DEPENDENCY);
projectMetrics.add(MetricEnum.CUMULATIVE_COMPONENT_DEPENDENCY);
projectMetrics.add(MetricEnum.CUMULATIVE_COMPONENT_DEPENDENCY_FOR_BALANCED_BINARY_TREE);
projectMetrics.add(MetricEnum.CUMULATIVE_COMPONENT_DEPENDENCY_FOR_CYCLICALLY_DEPENDENT_GRAPH);
projectMetrics.add(MetricEnum.NORMALIZED_CUMULATIVE_COMPONENT_DEPENDENCY);
//Number of compilation units is SIZE or number of files
//
//internal are those who passed the filter and external the rest
//so NumberOfProjectInternalCompilationUnits means SIZE
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_EXTERNAL_COMPILATION_UNITS);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_INTERNAL_COMPILATION_UNITS);
//same as NumberOfProjectInternalCompilationUnits according to dependometer-core code
projectMetrics.add(MetricEnum.NUMBER_OF_COMPONENTS);
//
projectMetrics.add(MetricEnum.PERCENTAGE_OF_PROJECT_INTERNAL_LAYERS_WITH_A_RELATIONAL_COHESION_GREATER_THAN_ONE);
projectMetrics.add(MetricEnum.PERCENTAGE_OF_PROJECT_INTERNAL_PACKAGES_WITH_A_RELATIONAL_COHESION_GREATER_THAN_ONE);
projectMetrics.add(MetricEnum.PERCENTAGE_OF_PROJECT_INTERNAL_SUBSYSTEMS_WITH_A_RELATIONAL_COHESION_GREATER_THAN_ONE);
projectMetrics.add(MetricEnum.PERCENTAGE_OF_PROJECT_INTERNAL_VERTICAL_SLICES_WITH_A_RELATIONAL_COHESION_GREATER_THAN_ONE);
projectMetrics.add(MetricEnum.NUMBER_OF_ASSERTIONS);
projectMetrics.add(MetricEnum.AVERAGE_USAGE_OF_ASSERTIONS_PER_CLASS);
//Metric described as "total number of efferent package dependencies" in docs
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES);
//Metric described as "total number of forbidden efferent package dependencies"
projectMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_DEPENDENCIES);
//Metric described as "total number of project internal efferent package dependencies"
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES_TO_PROJECT_EXTERNAL);
//undocumented
//determined by dependometer-core code
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_INTERNAL_LAYERS);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_INTERNAL_PACKAGES);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_INTERNAL_SUBSYSTEMS);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_INTERNAL_TYPES);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_INTERNAL_VERTICAL_SLICES);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_EXTERNAL_LAYERS);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_EXTERNAL_PACKAGES);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_EXTERNAL_SUBSYSTEMS);
projectMetrics.add(MetricEnum.NUMBER_OF_PROJECT_EXTERNAL_TYPES);
projectMetrics.add(MetricEnum.CYCLES_EXIST_BETWEEN_PROJECT_INTERNAL_COMPILATION_UNITS);
projectMetrics.add(MetricEnum.CYCLES_EXIST_BETWEEN_PROJECT_INTERNAL_LAYERS);
projectMetrics.add(MetricEnum.CYCLES_EXIST_BETWEEN_PROJECT_INTERNAL_PACKAGES);
projectMetrics.add(MetricEnum.CYCLES_EXIST_BETWEEN_PROJECT_INTERNAL_SUBSYSTEM);
projectMetrics.add(MetricEnum.CYCLES_EXIST_BETWEEN_PROJECT_INTERNAL_TYPES);
projectMetrics.add(MetricEnum.CYCLES_EXIST_BETWEEN_PROJECT_INTERNAL_VERTICAL_SLICES);
projectMetrics.add(MetricEnum.MAX_DEPTH_OF_PACKAGE_HIERARCHY);
projectMetrics.add(MetricEnum.MAX_DEPTH_OF_TYPE_INHERITANCE);
projectMetrics.add(MetricEnum.NUMBER_OF_ALLOWED_OUTGOING_LAYER_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_ALLOWED_OUTGOING_PACKAGE_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_ALLOWED_OUTGOING_SUBSYSTEM_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_COMPILATION_UNIT_CYCLES);
projectMetrics.add(MetricEnum.AFFERENT_INCOMING_COUPLING_PROJECT_EXTERNAL);
projectMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_COMPILATION_UNIT_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_LAYER_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_PACKAGE_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_SUBSYSTEM_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_TYPE_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_VERTICAL_SLICE_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_NOT_ASSIGNED_PACKAGES);
projectMetrics.add(MetricEnum.NUMBER_OF_NOT_IMPLEMENTED_SUBSYSTEMS);
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_COMPILATION_UNIT_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_LAYER_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_PACKAGE_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_SUBSYSTEM_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_TYPE_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_VERTICAL_SLICE_DEPENDENCIES);
projectMetrics.add(MetricEnum.NUMBER_OF_PACKAGE_CYCLES);
projectMetrics.add(MetricEnum.NUMBER_OF_TYPE_CYCLES);
projectMetrics.add(MetricEnum.NUMBER_OF_SUBSYSTEM_CYCLES);
projectMetrics.add(MetricEnum.NUMBER_OF_LAYER_CYCLES);
projectMetrics.add(MetricEnum.AVERAGE_USAGE_OF_ASSERTIONS_PER_CLASS);
projectMetrics.add(MetricEnum.NUMBER_OF_TYPE_TANGLES);
projectMetrics.add(MetricEnum.NUMBER_OF_COMPILATION_UNIT_TANGLES);
projectMetrics.add(MetricEnum.NUMBER_OF_SUBSYSTEM_TANGLES);
projectMetrics.add(MetricEnum.NUMBER_OF_PACKAGE_TANGLES);
projectMetrics.add(MetricEnum.NUMBER_OF_LAYER_TANGLES);
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Layer metrics">
layerMetrics = new LinkedList<MetricEnum>();
//"contained subsystems and their inner layer dependencies
layerMetrics.add(MetricEnum.NUMBER_OF_CONTAINED_SUBSYSTEMS);
//"afferent (incoming) and efferent (outgoing) dependencies - subsystems causing these dependencies"
//not found in code
//common for the elements layer, subsystem and package
//abstract types (Na)
layerMetrics.add(MetricEnum.NUMBER_OF_ABSTRACT_TYPES);
//abstractness (A)
layerMetrics.add(MetricEnum.ABSTRACTNESS);
//accessible types
layerMetrics.add(MetricEnum.NUMBER_OF_ACCESSIBLE_TYPES);
//afferent (incoming) dependencies
layerMetrics.add(MetricEnum.NUMBER_OF_INCOMING_DEPENDENCIES);
//afferent coupling (Ca)
layerMetrics.add(MetricEnum.AFFERENT_INCOMING_COUPLING);
//assertions
layerMetrics.add(MetricEnum.NUMBER_OF_ASSERTIONS);
//average component dependency (ACD)
layerMetrics.add(MetricEnum.AVERAGE_COMPONENT_DEPENDENCY);
//cumulative component dependency (CCD)
layerMetrics.add(MetricEnum.CUMULATIVE_COMPONENT_DEPENDENCY);
//depends upon elements (incl. self)
layerMetrics.add(MetricEnum.DEPENDS_UPON);
//distance (D)
layerMetrics.add(MetricEnum.DISTANCE);
//efferent (outgoing) dependencies (internal and external)
layerMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES);
//efferent coupling (Ce)
layerMetrics.add(MetricEnum.EFFERENT_OUTGOING_COUPLING);
//external type relations
layerMetrics.add(MetricEnum.NUMBER_OF_EXTERNAL_TYPE_RELATIONS);
//forbidden efferent (outgoing) dependencies
layerMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_DEPENDENCIES);
//instability (I)
layerMetrics.add(MetricEnum.INSTABILITY);
//internal type relations
layerMetrics.add(MetricEnum.NUMBER_OF_INTERNAL_TYPE_RELATIONS);
//number of compilation units (SIZE)
//not found in code or list
//relational cohesion (Rc)
layerMetrics.add(MetricEnum.RELATIONAL_COHESION);
//types (Nc)
layerMetrics.add(MetricEnum.NUMBER_OF_TYPES);
//no physical project internal dependencies detected
layerMetrics.add(MetricEnum.NO_DEPENCIES_DETECTED);
//project internal/external
layerMetrics.add(MetricEnum.PROJECT_INTERNAL);
layerMetrics.add(MetricEnum.PROJECT_EXTERNAL);
//abstract/concrete
layerMetrics.add(MetricEnum.ABSTRACT);
//accessible/not accessible
layerMetrics.add(MetricEnum.ACCESSIBLE);
//check actual dependencies against explicitly allowed dependencies
//not found
//usage detection of explicitly allowed dependencies
//not found
//"cycles and cumulated participation of dependencies"
//not found
//"levelization"
//not found
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Vertical slice metrics">
verticalSliceMetrics = new LinkedList<MetricEnum>();
//"contained subsystems and their inner layer dependencies
verticalSliceMetrics.add(MetricEnum.NUMBER_OF_CONTAINED_SUBSYSTEMS);
//"afferent (incoming) and efferent (outgoing) dependencies - subsystems causing these dependencies"
//not found in code
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Subsystem metrics">
subsystemMetrics = new LinkedList<MetricEnum>();
//containing layer
//containing vertical-slice
//contained packages and their inner subsystem dependencies
//afferent (incoming) and efferent (outgoing) dependencies - packages causing these dependencies
//Not implemented subsystems
subsystemMetrics.add(MetricEnum.NUMBER_OF_CONTAINED_PACKAGES);
//common for the elements layer, subsystem and package
//abstract types (Na)
subsystemMetrics.add(MetricEnum.NUMBER_OF_ABSTRACT_TYPES);
//abstractness (A)
subsystemMetrics.add(MetricEnum.ABSTRACTNESS);
//accessible types
subsystemMetrics.add(MetricEnum.NUMBER_OF_ACCESSIBLE_TYPES);
//afferent (incoming) dependencies
subsystemMetrics.add(MetricEnum.NUMBER_OF_INCOMING_DEPENDENCIES);
//afferent coupling (Ca)
subsystemMetrics.add(MetricEnum.AFFERENT_INCOMING_COUPLING);
//assertions
subsystemMetrics.add(MetricEnum.NUMBER_OF_ASSERTIONS);
//average component dependency (ACD)
subsystemMetrics.add(MetricEnum.AVERAGE_COMPONENT_DEPENDENCY);
//cumulative component dependency (CCD)
subsystemMetrics.add(MetricEnum.CUMULATIVE_COMPONENT_DEPENDENCY);
//depends upon elements (incl. self)
subsystemMetrics.add(MetricEnum.DEPENDS_UPON);
//distance (D)
subsystemMetrics.add(MetricEnum.DISTANCE);
//efferent (outgoing) dependencies (internal and external)
subsystemMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES);
//efferent coupling (Ce)
subsystemMetrics.add(MetricEnum.EFFERENT_OUTGOING_COUPLING);
//external type relations
subsystemMetrics.add(MetricEnum.NUMBER_OF_EXTERNAL_TYPE_RELATIONS);
//forbidden efferent (outgoing) dependencies
subsystemMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_DEPENDENCIES);
//instability (I)
subsystemMetrics.add(MetricEnum.INSTABILITY);
//internal type relations
subsystemMetrics.add(MetricEnum.NUMBER_OF_INTERNAL_TYPE_RELATIONS);
//number of compilation units (SIZE)
//not found in code or list
//relational cohesion (Rc)
subsystemMetrics.add(MetricEnum.RELATIONAL_COHESION);
//types (Nc)
subsystemMetrics.add(MetricEnum.NUMBER_OF_TYPES);
//no physical project internal dependencies detected
subsystemMetrics.add(MetricEnum.NO_DEPENCIES_DETECTED);
//project internal/external
subsystemMetrics.add(MetricEnum.PROJECT_INTERNAL);
subsystemMetrics.add(MetricEnum.PROJECT_EXTERNAL);
//abstract/concrete
subsystemMetrics.add(MetricEnum.ABSTRACT);
//accessible/not accessible
subsystemMetrics.add(MetricEnum.ACCESSIBLE);
//check actual dependencies against explicitly allowed dependencies
//not found
//usage detection of explicitly allowed dependencies
//not found
//"cycles and cumulated participation of dependencies"
//not found
//"levelization"
//not found
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Package metrics">
packageMetrics = new LinkedList<MetricEnum>();
//common for the elements layer, subsystem and package
packageMetrics.add(MetricEnum.NUMBER_OF_ABSTRACT_TYPES);
packageMetrics.add(MetricEnum.ABSTRACTNESS);
packageMetrics.add(MetricEnum.NUMBER_OF_ACCESSIBLE_TYPES);
packageMetrics.add(MetricEnum.NUMBER_OF_INCOMING_DEPENDENCIES);
packageMetrics.add(MetricEnum.AFFERENT_INCOMING_COUPLING);
packageMetrics.add(MetricEnum.NUMBER_OF_ASSERTIONS);
packageMetrics.add(MetricEnum.AVERAGE_COMPONENT_DEPENDENCY);
packageMetrics.add(MetricEnum.CUMULATIVE_COMPONENT_DEPENDENCY);
packageMetrics.add(MetricEnum.DEPENDS_UPON);
packageMetrics.add(MetricEnum.DISTANCE);
packageMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES);
packageMetrics.add(MetricEnum.EFFERENT_OUTGOING_COUPLING);
packageMetrics.add(MetricEnum.NUMBER_OF_EXTERNAL_TYPE_RELATIONS);
packageMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_DEPENDENCIES);
packageMetrics.add(MetricEnum.INSTABILITY);
packageMetrics.add(MetricEnum.NUMBER_OF_INTERNAL_TYPE_RELATIONS);
//"number of compilation units (SIZE)"
//not found in code or list
packageMetrics.add(MetricEnum.RELATIONAL_COHESION);
packageMetrics.add(MetricEnum.NUMBER_OF_TYPES);
//no physical project internal dependencies detected
packageMetrics.add(MetricEnum.NO_DEPENCIES_DETECTED);
packageMetrics.add(MetricEnum.PROJECT_INTERNAL);
packageMetrics.add(MetricEnum.PROJECT_EXTERNAL);
packageMetrics.add(MetricEnum.ABSTRACT);
packageMetrics.add(MetricEnum.ACCESSIBLE);
//"check actual dependencies against explicitly allowed dependencies"
//not found
//"usage detection of explicitly allowed dependencies"
//not found
packageMetrics.add(MetricEnum.NUMBER_OF_PACKAGE_CYCLES);
//"cycles and cumulated participation of dependencies"
//not found
//"levelization"
//not found
//found in code only
packageMetrics.add(MetricEnum.DEPTH_OF_PACKAGE_HIERARCHY);
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Compilation unit metrics">
compilationUnitMetrics = new LinkedList<MetricEnum>();
//containing package
//attribute not metric
//contained types and their inner compilation unit dependencies
//attribute not metric
//abstract types
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_ABSTRACT_TYPES);
//accessible types
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_ACCESSIBLE_TYPES);
//afferent (incoming) dependencies
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_INCOMING_DEPENDENCIES);
//assertions
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_ASSERTIONS);
//concrete types
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_CONCRETE_TYPES);
//depends upon elements (incl. self)
compilationUnitMetrics.add(MetricEnum.DEPENDS_UPON);
//efferent (outgoing) dependencies (internal and external)
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES);
//forbidden efferent (outgoing) dependencies
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_DEPENDENCIES);
//more external than internal relations per package exist
compilationUnitMetrics.add(MetricEnum.MORE_PACKAGE_EXTERNAL_THAN_INTERNAL_RELATIONS_EXIST); //boolean
//the most external relations exist with package
compilationUnitMetrics.add(MetricEnum.THE_MOST_EXTERNAL_RELATIONS_EXIST_WITH_PACKAGE); //boolean
//total external package relations
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_PACKAGE_EXTERNAL_RELATIONS);
//total internal package relations
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_PACKAGE_INTERNAL_RELATIONS);
//types
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_TYPES);
//no physical project internal dependencies detected
compilationUnitMetrics.add(MetricEnum.NO_INCOMING_DEPENCIES_DETECTED);
compilationUnitMetrics.add(MetricEnum.NO_DEPENCIES_DETECTED);
//abstract/concrete
//not found
//accessible/not accessible
//not found
//cycles and cumulated participation of dependencies
//not found
//levelization
//not found
//from code
compilationUnitMetrics.add(MetricEnum.CONTAINS_ACCESSIBLE_TYPES_BUT_NO_INCOMING_OUTER_PACKAGE_DEPENDENCIES_EXIST);
compilationUnitMetrics.add(MetricEnum.REFACTORED);
compilationUnitMetrics.add(MetricEnum.PROJECT_INTERNAL);
compilationUnitMetrics.add(MetricEnum.PROJECT_EXTERNAL);
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES_TO_PROJECT_EXTERNAL);
compilationUnitMetrics.add(MetricEnum.NUMBER_OF_INCOMING_DEPENDENCIES_PROJECT_EXTERNAL);
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Type metrics">
typeMetrics = new LinkedList<MetricEnum>();
//containing compilation unit
//attribute not metric
//abstract/concrete
typeMetrics.add(MetricEnum.ABSTRACT);
//accessible/not accessible
typeMetrics.add(MetricEnum.ACCESSIBLE);
//abstract types
typeMetrics.add(MetricEnum.NUMBER_OF_ABSTRACT_TYPES);
//accessible types
typeMetrics.add(MetricEnum.NUMBER_OF_ACCESSIBLE_TYPES);
//afferent (incoming) dependencies
typeMetrics.add(MetricEnum.NUMBER_OF_INCOMING_DEPENDENCIES);
//efferent (outgoing) dependencies (internal and external)
typeMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES);
//forbidden efferent (outgoing) dependencies
typeMetrics.add(MetricEnum.NUMBER_OF_FORBIDDEN_OUTGOING_DEPENDENCIES);
//interface
typeMetrics.add(MetricEnum.INTERFACE);
//no physical project internal dependencies detected
typeMetrics.add(MetricEnum.NO_INCOMING_DEPENCIES_DETECTED);
typeMetrics.add(MetricEnum.NO_DEPENCIES_DETECTED);
//number of childs (NOC)
typeMetrics.add(MetricEnum.NUMBER_OF_CHILDREN);
//DepthOfClassInheritance
typeMetrics.add(MetricEnum.DEPTH_OF_CLASS_INHERITANCE);
//DepthOfInterfaceInheritance
typeMetrics.add(MetricEnum.DEPTH_OF_INTERFACE_INHERITANCE);
//cycles and cumulated participation of dependencies
//not found
//levelization
//not found
//from code
typeMetrics.add(MetricEnum.NESTED);
typeMetrics.add(MetricEnum.REFACTORED);
typeMetrics.add(MetricEnum.PROJECT_INTERNAL);
typeMetrics.add(MetricEnum.DEPENDS_UPON);
typeMetrics.add(MetricEnum.NUMBER_OF_OUTGOING_DEPENDENCIES_TO_PROJECT_EXTERNAL);
typeMetrics.add(MetricEnum.PROJECT_EXTERNAL);
typeMetrics.add(MetricEnum.NUMBER_OF_INCOMING_DEPENDENCIES_PROJECT_EXTERNAL);
typeMetrics.add(MetricEnum.EXTENDABLE);
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Not implemented metrics">
notImplementedMetrics = new LinkedList<MetricEnum>();
notImplementedMetrics.add(MetricEnum.NUMBER_OF_SKIP_NODES);
notImplementedMetrics.add(MetricEnum.NUMBER_OF_IGNORE_NODES);
notImplementedMetrics.add(MetricEnum.NUMBER_OF_REFACTORING_NODES);
notImplementedMetrics.add(MetricEnum.NUMBER_OF_VERTICAL_SLICES_CYCLES);
notImplementedMetrics.add(MetricEnum.NUMBER_OF_VERTICAL_SLICE_TANGLES);
// </editor-fold>
}
public static String getDescription(MetricEnum metricEnum) throws DependometerException {
MetricDefinition[] metrics = MetricDefinition.getMetricDefinitions();
if (metrics == null) {
throw new DependometerException("No metrics definition found");
}
for (MetricDefinition metricDefinition : metrics) {
if (metricEnum.equals(getMetricEnum(metricDefinition))) {
return metricDefinition.getDescription();
}
}
return null;
}
private static MetricDefinition getMetricDefinition(MetricEnum metricEnum) throws DependometerException {
MetricDefinition[] metrics = MetricDefinition.getMetricDefinitions();
if (metrics == null) {
throw new DependometerException("No metrics definition found");
}
for (MetricDefinition metricDefinition : metrics) {
if (metricEnum.equals(getMetricEnum(metricDefinition))) {
return metricDefinition;
}
}
return null;
}
public static String buildID(String label) {
String s[] = label.split(" ");
String id = "";
for (int i = 0; i < s.length; i++) {
id += capitalize(s[i]);
}
id = id.replace("(", "_").replace(")", "").trim();
return id.replace(">=", "MoreThen").replace("<=", "LessThen");
}
public static String capitalize(String s) {
if (s.length() == 0) {
return "";
} else {
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
}
public static String getMetricName(Metric metric) throws DependometerException {
MetricEnum meEnum;
String name = metric.getName();
MetricEnumeration meEnumeration = MetricEnumeration.getMetricByName(name);
if (meEnumeration != null) {
//Dependometer metric
meEnum = getDependometerMetric(meEnumeration);
} else {
//Dependometer metric which exists in Oceano
name = metric.getAcronym();
meEnum = getMetricEnum(name);
}
return getMetricName(meEnum);
}
public static String getMetricName(MetricIf metricIf) throws Exception {
MetricEnum metricEnum = getMetricEnum(metricIf.getName());
if (metricEnum != null) {
return getMetricName(metricEnum);
}
throw new Exception("Metric not found: " + metricIf.getName());
}
public static String getMetricName(MetricEnum metric) {
return metric.name();
}
public static MetricEnum getMetricEnum(MetricDefinition metricDefinition) {
return getMetricEnum(metricDefinition.getName());
}
public static MetricEnum getMetricEnum(String displayName) {
MetricEnum[] values = MetricEnum.values();
for (int i = 0; i < values.length; i++) {
MetricEnum metricEnum = values[i];
if (displayName.compareToIgnoreCase(metricEnum.getDisplayName()) == 0) {
return metricEnum;
}
}
return null;
}
public static boolean isNumberMetric(MetricEnum metricEnum) throws DependometerException {
MetricDefinition metric = getMetricDefinition(metricEnum);
if (metric == null) {
throw new DependometerException("Metric definition not found for " + metricEnum);
}
return TYPE_NUMBER.equals(metric.getValueType());
}
/**
* Returns metrics that : result in number exist in Oceano with different
* names
*
* @return
* @throws DependometerException
*/
public static List<MetricEnum> getValidProjectMetrics() throws DependometerException {
List<MetricEnum> metrics = new LinkedList<MetricEnum>();
for (MetricEnum metricEnum : getAllMetric()) {
if (!isNumberMetric(metricEnum)) {
continue;
}
if (!isProjectMetric(metricEnum) && !canBeProjectMetric(metricEnum)) {
continue;
}
metrics.add(metricEnum);
}
return metrics;
}
public static List<MetricEnum> getValidPackageMetrics() throws DependometerException {
List<MetricEnum> metrics = new LinkedList<MetricEnum>();
for (MetricEnum metricEnum : getAllMetric()) {
if (!isNumberMetric(metricEnum)) {
continue;
} else if (!isPackageMetric(metricEnum)) {
continue;
} else if (canBeProjectMetric(metricEnum)) {
continue;
}
metrics.add(metricEnum);
}
return metrics;
}
public static List<MetricEnum> getValidCompilationUnitMetrics() throws DependometerException {
List<MetricEnum> metrics = new LinkedList<MetricEnum>();
for (MetricEnum metricEnum : getAllMetric()) {
if (!isNumberMetric(metricEnum)) {
continue;
} else if (!isCompilationUnitMetric(metricEnum)) {
continue;
} else if (canBeProjectMetric(metricEnum)) {
continue;
}
metrics.add(metricEnum);
}
return metrics;
}
public static List<MetricEnum> getValidTypeMetrics() throws DependometerException {
List<MetricEnum> metrics = new LinkedList<MetricEnum>();
for (MetricEnum metricEnum : getAllMetric()) {
if (!isNumberMetric(metricEnum)) {
continue;
} else if (!isTypeMetric(metricEnum)) {
continue;
} else if (canBeProjectMetric(metricEnum)) {
continue;
}
metrics.add(metricEnum);
}
return metrics;
}
private static Set<MetricEnum> getAllMetric() {
Set<MetricEnum> metrics = new HashSet<MetricEnum>();
metrics.addAll(projectMetrics);
metrics.addAll(layerMetrics);
metrics.addAll(subsystemMetrics);
metrics.addAll(verticalSliceMetrics);
metrics.addAll(packageMetrics);
metrics.addAll(compilationUnitMetrics);
metrics.addAll(typeMetrics);
return metrics;
}
}