edu.uci.ics.sourcerer.tools.java.metrics.db.NumberOfInterfaceRelativesCalculator.java Source code

Java tutorial

Introduction

Here is the source code for edu.uci.ics.sourcerer.tools.java.metrics.db.NumberOfInterfaceRelativesCalculator.java

Source

/* 
 * Sourcerer: an infrastructure for large-scale source code analysis.
 * Copyright (C) by contributors. See CONTRIBUTORS.txt for full list.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
    
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
    
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package edu.uci.ics.sourcerer.tools.java.metrics.db;

import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import java.util.regex.Pattern;

import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;

import edu.uci.ics.sourcerer.tools.java.db.schema.EntityMetricsTable;
import edu.uci.ics.sourcerer.tools.java.db.schema.ProjectMetricsTable;
import edu.uci.ics.sourcerer.tools.java.db.type.ModeledDeclaredType;
import edu.uci.ics.sourcerer.tools.java.db.type.ModeledEntity;
import edu.uci.ics.sourcerer.tools.java.db.type.ModeledParametrizedType;
import edu.uci.ics.sourcerer.tools.java.db.type.ModeledStructuralEntity;
import edu.uci.ics.sourcerer.tools.java.db.type.TypeModel;
import edu.uci.ics.sourcerer.tools.java.metrics.db.MetricModelFactory.ProjectMetricModel;
import edu.uci.ics.sourcerer.tools.java.model.types.Entity;
import edu.uci.ics.sourcerer.tools.java.model.types.Metric;
import edu.uci.ics.sourcerer.util.Averager;
import edu.uci.ics.sourcerer.util.io.logging.TaskProgressLogger;
import edu.uci.ics.sourcerer.utils.db.QueryExecutor;

/**
 * @author Joel Ossher (jossher@uci.edu)
 */
public class NumberOfInterfaceRelativesCalculator extends Calculator {
    @Override
    public boolean shouldCalculate(ProjectMetricModel metrics) {
        return metrics.missingValue(Metric.NUMBER_OF_INTERFACE_CHILDREN, Metric.NUMBER_OF_DIRECT_INTERFACE_CHILDREN,
                Metric.NUMBER_OF_IMPLEMENTED_INTERFACES, Metric.NUMBER_OF_SUPER_INTERFACES);
    }

    @Override
    public void calculate(QueryExecutor exec, Integer projectID, ProjectMetricModel metrics, TypeModel model) {
        TaskProgressLogger task = TaskProgressLogger.get();

        Pattern anon = Pattern.compile(".*\\$\\d+$");

        task.start("Computing NumberOfInterfaceRelatives");
        Multiset<ModeledStructuralEntity> parents = HashMultiset.create();
        Multiset<ModeledDeclaredType> directParents = HashMultiset.create();
        Averager<Double> avgNoii = Averager.create();
        Averager<Double> avgNosi = Averager.create();
        task.start("Processing types", "types processed", 0);
        for (ModeledEntity entity : model.getEntities()) {
            if (projectID.equals(entity.getProjectID())) {
                if (entity.getType().is(Entity.CLASS, Entity.ENUM) && !anon.matcher(entity.getFqn()).matches()) {
                    ModeledDeclaredType dec = (ModeledDeclaredType) entity;
                    Double value = (double) dec.getInterfaces().size();
                    if (metrics.missingEntityValue(dec.getEntityID(), Metric.NUMBER_OF_IMPLEMENTED_INTERFACES)) {
                        metrics.setEntityValue(dec.getEntityID(), dec.getFileID(),
                                Metric.NUMBER_OF_IMPLEMENTED_INTERFACES, value);
                        exec.insert(EntityMetricsTable.createInsert(projectID, dec.getFileID(), dec.getEntityID(),
                                Metric.NUMBER_OF_IMPLEMENTED_INTERFACES, value));
                    }
                    avgNoii.addValue(value);
                    task.progress();
                } else if (entity.getType() == Entity.INTERFACE) {
                    ModeledDeclaredType dec = (ModeledDeclaredType) entity;
                    Double value = (double) dec.getInterfaces().size();
                    if (metrics.missingEntityValue(dec.getEntityID(), Metric.NUMBER_OF_SUPER_INTERFACES)) {
                        metrics.setEntityValue(dec.getEntityID(), dec.getFileID(),
                                Metric.NUMBER_OF_SUPER_INTERFACES, value);
                        exec.insert(EntityMetricsTable.createInsert(projectID, dec.getFileID(), dec.getEntityID(),
                                Metric.NUMBER_OF_SUPER_INTERFACES, value));
                    }
                    avgNosi.addValue(value);
                    Set<ModeledEntity> seen = new HashSet<>();
                    for (ModeledEntity iface : dec.getInterfaces()) {
                        Deque<ModeledEntity> stack = new LinkedList<>();
                        stack.push(iface);
                        boolean first = true;
                        while (!stack.isEmpty()) {
                            ModeledEntity next = stack.pop();
                            if (!seen.contains(next)) {
                                if (next.getType() == Entity.PARAMETERIZED_TYPE) {
                                    ModeledEntity base = ((ModeledParametrizedType) next).getBaseType();
                                    if (base != null) {
                                        stack.push(base);
                                    }
                                } else if (projectID.equals(next.getProjectID())) {
                                    ModeledDeclaredType face = (ModeledDeclaredType) next;
                                    if (first) {
                                        directParents.add(face);
                                        first = false;
                                    }
                                    seen.add(face);
                                    parents.add(face);
                                    stack.addAll(face.getInterfaces());
                                }
                            }
                        }
                    }
                    task.progress();
                }
            }
        }
        task.finish();

        if (metrics.missingValue(Metric.NUMBER_OF_IMPLEMENTED_INTERFACES)) {
            metrics.setValue(Metric.NUMBER_OF_IMPLEMENTED_INTERFACES, avgNoii);
            exec.insert(
                    ProjectMetricsTable.createInsert(projectID, Metric.NUMBER_OF_IMPLEMENTED_INTERFACES, avgNoii));
        }
        if (metrics.missingValue(Metric.NUMBER_OF_SUPER_INTERFACES)) {
            metrics.setValue(Metric.NUMBER_OF_SUPER_INTERFACES, avgNosi);
            exec.insert(ProjectMetricsTable.createInsert(projectID, Metric.NUMBER_OF_SUPER_INTERFACES, avgNosi));
        }
        Averager<Double> avgNoi = Averager.create();
        Averager<Double> avgDnoi = Averager.create();
        for (ModeledEntity entity : model.getEntities()) {
            if (projectID.equals(entity.getProjectID()) && entity.getType() == Entity.INTERFACE) {
                ModeledDeclaredType dec = (ModeledDeclaredType) entity;
                Double value = (double) parents.count(dec);
                if (metrics.missingEntityValue(dec.getEntityID(), Metric.NUMBER_OF_INTERFACE_CHILDREN)) {
                    metrics.setEntityValue(dec.getEntityID(), dec.getFileID(), Metric.NUMBER_OF_INTERFACE_CHILDREN,
                            value);
                    exec.insert(EntityMetricsTable.createInsert(projectID, dec.getFileID(), dec.getEntityID(),
                            Metric.NUMBER_OF_INTERFACE_CHILDREN, value));
                }
                avgNoi.addValue(value);

                value = (double) directParents.count(dec);
                if (metrics.missingEntityValue(dec.getEntityID(), Metric.NUMBER_OF_DIRECT_INTERFACE_CHILDREN)) {
                    metrics.setEntityValue(dec.getEntityID(), dec.getFileID(),
                            Metric.NUMBER_OF_DIRECT_INTERFACE_CHILDREN, value);
                    exec.insert(EntityMetricsTable.createInsert(projectID, dec.getFileID(), dec.getEntityID(),
                            Metric.NUMBER_OF_DIRECT_INTERFACE_CHILDREN, value));
                }
                avgDnoi.addValue(value);
            }
        }
        if (metrics.missingValue(Metric.NUMBER_OF_INTERFACE_CHILDREN)) {
            metrics.setValue(Metric.NUMBER_OF_INTERFACE_CHILDREN, avgNoi);
            exec.insert(ProjectMetricsTable.createInsert(projectID, Metric.NUMBER_OF_INTERFACE_CHILDREN, avgNoi));
        }
        if (metrics.missingValue(Metric.NUMBER_OF_DIRECT_INTERFACE_CHILDREN)) {
            metrics.setValue(Metric.NUMBER_OF_DIRECT_INTERFACE_CHILDREN, avgDnoi);
            exec.insert(ProjectMetricsTable.createInsert(projectID, Metric.NUMBER_OF_DIRECT_INTERFACE_CHILDREN,
                    avgDnoi));
        }
        task.finish();
    }
}