package br.uff.ic.oceano.core.tools.metrics.extractors.dependometer; import br.uff.ic.oceano.core.tools.metrics.extractors.dependometer.util.MetricHelper; import br.uff.ic.oceano.core.tools.metrics.MetricEnumeration; import br.uff.ic.oceano.core.exception.ObjetoNaoEncontradoException; import br.uff.ic.oceano.core.factory.ObjectFactory; import br.uff.ic.oceano.core.model.Metric; import br.uff.ic.oceano.core.model.MetricExtractor; import br.uff.ic.oceano.core.model.transiente.Language; import br.uff.ic.oceano.core.tools.metrics.service.MetricExtractorService; import br.uff.ic.oceano.core.tools.metrics.service.MetricService; import br.uff.ic.oceano.util.Output; import com.valtech.source.dependometer.app.core.common.MetricEnum; import java.util.List; /** * //TODO fix metrics classification. Dependometer allows some metrics for * project and package, maybe file too. Replicate for each support Demands * remodel of Metric class * * @author Daniel */ public class MetricsLoader { private static MetricsLoader self; private MetricService metricService; private MetricExtractorService metricExtractorService; private MetricsLoader() { metricService = ObjectFactory.getObjectWithDataBaseDependencies(MetricService.class); metricExtractorService = ObjectFactory.getObjectWithDataBaseDependencies(MetricExtractorService.class); } public static MetricsLoader getSelf() { if (self == null) { self = new MetricsLoader(); } return self; } public static void load() throws DependometerException { Output.println("Inserting dependometer metrics"); try { getSelf().addProjectMetrics(); getSelf().addPackageMetrics(); getSelf().addFileMetrics(); } catch (Exception ex) { ex.printStackTrace(); } } private void addProjectMetrics() throws DependometerException { Output.println("Inserting project metrics"); List<MetricEnum> metrics = MetricHelper.getValidProjectMetrics(); for (MetricEnum metricEnum : metrics) { addProjectMetric(metricEnum); } } private void addPackageMetrics() throws DependometerException { Output.println("Inserting package metrics"); List<MetricEnum> metrics = MetricHelper.getValidPackageMetrics(); for (MetricEnum metricEnum : metrics) { addPackageMetric(metricEnum); } } private void addFileMetrics() throws DependometerException { Output.println("Inserting file metrics"); List<MetricEnum> metrics = MetricHelper.getValidCompilationUnitMetrics(); for (MetricEnum metricEnum : metrics) { addCompilationUnitMetric(metricEnum); } metrics = MetricHelper.getValidTypeMetrics(); for (MetricEnum metricEnum : metrics) { addTypeMetric(metricEnum); } } /** * * @param metricEnum * @throws DependometerException */ private void addProjectMetric(MetricEnum metricEnum) throws DependometerException { Output.println("Addition metric " + metricEnum); if (!MetricHelper.isNumberMetric(metricEnum)) { Output.println("Ignoring addition of non numeric metric " + metricEnum); return; } Metric metric = createMetric(metricEnum, Metric.EXTRACTS_FROM_PROJECT); saveMetric(metric); } private void addCompilationUnitMetric(MetricEnum metricEnum) throws DependometerException { Output.println("Addition metric " + metricEnum); if (!MetricHelper.isNumberMetric(metricEnum)) { Output.println("Ignoring addition of non numeric metric " + metricEnum); return; } Metric metric = createMetric(metricEnum, Metric.EXTRACTS_FROM_FILE); saveMetric(metric); } private void addPackageMetric(MetricEnum metricEnum) throws DependometerException { Output.println("Addition metric " + metricEnum); if (!MetricHelper.isNumberMetric(metricEnum)) { Output.println("Ignoring addition of non numeric metric " + metricEnum); return; } Metric metric = createMetric(metricEnum, Metric.EXTRACTS_FROM_PACKAGE); saveMetric(metric); } private void addTypeMetric(MetricEnum metricEnum) throws DependometerException { Output.println("Addition metric " + metricEnum); if (!MetricHelper.isNumberMetric(metricEnum)) { Output.println("Ignoring addition of non numeric metric " + metricEnum); return; } } private void addSubsystemMetric(MetricEnum metricEnum) throws DependometerException { Output.println("Addition metric " + metricEnum); if (!MetricHelper.isNumberMetric(metricEnum)) { Output.println("Ignoring addition of non numeric metric " + metricEnum); return; } } private void addLayerMetric(MetricEnum metricEnum) throws DependometerException { Output.println("Addition metric " + metricEnum); if (!MetricHelper.isNumberMetric(metricEnum)) { Output.println("Ignoring addition of non numeric metric " + metricEnum); return; } } private Metric createMetric(MetricEnum metricEnum, int target) throws DependometerException { if (!MetricHelper.isNumberMetric(metricEnum)) { throw new DependometerException("Not a number metric: " + metricEnum); } String name; String acronym; String description; //Translate metrics names MetricEnumeration oceanoMetric = MetricHelper.getOceanoMetric(metricEnum); if (oceanoMetric != null) { name = oceanoMetric.getName(); acronym = oceanoMetric.getAcronym(); description = oceanoMetric.getDescription(); } else { name = metricEnum.name(); acronym = metricEnum.getDisplayName(); description = MetricHelper.getDescription(metricEnum); } Metric metric = new Metric(); metric.setName(name); metric.setAcronym(acronym); metric.setDescription(description); metric.setType(Metric.TYPE_FLOAT); metric.setExtratcsFrom(target); metric.setExtractsFromFont(true); //dependometer does it own compilation if necessary return metric; } private void saveMetric(final Metric metric) throws DependometerException { //may be a overloaded if (!existsMetric(metric)) { metricService.save(metric); } //may be a extractor for different language insertMetricExtractor(metric.getAcronym()); } private boolean existsMetric(final Metric metric) throws DependometerException { try { return metricService.getByAcronym(metric.getAcronym()) != null; } catch (ObjetoNaoEncontradoException ex) { return false; } } private void insertMetricExtractor(String metricAcronym) throws DependometerException { try { Metric metric = metricService.getByAcronym(metricAcronym); if (metric == null) { throw new DependometerException("Metric " + metricAcronym + " not found"); } //CPP MetricExtractor metricExtractor = new MetricExtractor(); metricExtractor.setMetric(metric); metricExtractor.setLanguage(Language.CPP.name()); metricExtractor.setMetricExtractorClass(DependomenterExtractor.class.getCanonicalName()); if (!existsMetricExtractor(metricExtractor)) { metricExtractorService.save(metricExtractor); } //JAVA metricExtractor = new MetricExtractor(); metricExtractor.setMetric(metric); metricExtractor.setLanguage(Language.JAVA.name()); metricExtractor.setMetricExtractorClass(DependomenterExtractor.class.getCanonicalName()); if (!existsMetricExtractor(metricExtractor)) { metricExtractorService.save(metricExtractor); } } catch (ObjetoNaoEncontradoException ex) { throw new DependometerException("Fail to save metric extractor for " + metricAcronym, ex); } } private boolean existsMetricExtractor(MetricExtractor metricExtractor) throws DependometerException { try { List<MetricExtractor> metricExtractors = metricExtractorService.getMetricExtractorsByMetric(metricExtractor.getMetric()); for (MetricExtractor mext : metricExtractors) { if (!mext.getLanguage().equals(metricExtractor.getLanguage())) { continue; } //exist a extractor for the language return true; } return false; } catch (Exception ex) { throw new DependometerException("Fail to verify existency of metric extractor", ex); } } }