/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package br.uff.ic.oceano.core.service; import br.uff.ic.oceano.core.dao.QualityAttributeDao; import br.uff.ic.oceano.core.dao.impl.QualityAttributeDaoImpl; import br.uff.ic.oceano.core.exception.ObjetoNaoEncontradoException; import br.uff.ic.oceano.core.exception.ServiceException; import br.uff.ic.oceano.core.factory.MetricManagerFactory; import br.uff.ic.oceano.core.factory.ObjectFactory; import br.uff.ic.oceano.core.model.Metric; import br.uff.ic.oceano.core.model.MetricQualityAttribute; import br.uff.ic.oceano.core.model.MetricValue; import br.uff.ic.oceano.core.model.QualityAttribute; import static br.uff.ic.oceano.core.model.QualityAttribute.*; import br.uff.ic.oceano.core.model.Revision; import br.uff.ic.oceano.core.model.transiente.FactorMetric; import br.uff.ic.oceano.core.service.controletransacao.Transacional; import br.uff.ic.oceano.core.tools.metrics.MetricEnumeration; import br.uff.ic.oceano.core.tools.metrics.service.MeasurementService; import br.uff.ic.oceano.core.tools.metrics.service.MetricService; import br.uff.ic.oceano.util.file.Archive; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author Heliomar */ public class QualityAttributeService implements PersistenceService{ protected QualityAttributeDao qualityAttributeDao; protected MetricService metricService; public static List<String> allAtributtesNames = Arrays.asList(NAME_REUSABILITY, NAME_FLEXIBILITY, NAME_UNDERSTANDIBILITY, NAME_FUNCIONALITY, NAME_EXTENDIBILITY, NAME_EFFECTIVENESS); // the key is a string of QUALITY_ATTRIBUTE // the value is a List as { [-0,25 ; "DCC"] , [+0,25 ; "CAM"], [+0,25 ; "CIS"], [+0,25 ; "DSC"] } private static final Map<String, List<FactorMetric>> evaluationMap; public void setup() { qualityAttributeDao = ObjectFactory.getObjectWithDataBaseDependencies(QualityAttributeDaoImpl.class); metricService = ObjectFactory.getObjectWithDataBaseDependencies(MetricService.class); } static { evaluationMap = new HashMap<String, List<FactorMetric>>(); evaluationMap.put(NAME_REUSABILITY, Arrays.asList(new FactorMetric(-0.25f, MetricEnumeration.DCC.getAcronym()), new FactorMetric(0.25f, MetricEnumeration.CAM.getAcronym()), new FactorMetric(0.5f, MetricEnumeration.CIS.getAcronym()), new FactorMetric(0.5f, MetricEnumeration.DSC.getAcronym()))); evaluationMap.put(NAME_FLEXIBILITY, Arrays.asList(new FactorMetric(0.25f, MetricEnumeration.DAM.getAcronym()), new FactorMetric(-0.25f, MetricEnumeration.DCC.getAcronym()), new FactorMetric(0.5f, MetricEnumeration.MOA.getAcronym()), new FactorMetric(0.5f, MetricEnumeration.NOP.getAcronym()))); evaluationMap.put(NAME_UNDERSTANDIBILITY, Arrays.asList(new FactorMetric(-0.33f, MetricEnumeration.ANA.getAcronym()), new FactorMetric(0.33f, MetricEnumeration.DAM.getAcronym()), new FactorMetric(-0.33f, MetricEnumeration.DCC.getAcronym()), new FactorMetric(0.33f, MetricEnumeration.CAM.getAcronym()), new FactorMetric(-0.33f, MetricEnumeration.NOP.getAcronym()), new FactorMetric(-0.33f, MetricEnumeration.NOM.getAcronym()), new FactorMetric(-0.33f, MetricEnumeration.DSC.getAcronym()))); evaluationMap.put(NAME_FUNCIONALITY, Arrays.asList(new FactorMetric(0.12f, MetricEnumeration.CAM.getAcronym()), new FactorMetric(0.22f, MetricEnumeration.NOP.getAcronym()), new FactorMetric(0.22f, MetricEnumeration.CIS.getAcronym()), new FactorMetric(0.22f, MetricEnumeration.DSC.getAcronym()), new FactorMetric(0.22f, MetricEnumeration.NOH.getAcronym()))); evaluationMap.put(NAME_EXTENDIBILITY, Arrays.asList(new FactorMetric(0.5f, MetricEnumeration.ANA.getAcronym()), new FactorMetric(-0.5f, MetricEnumeration.DCC.getAcronym()), new FactorMetric(0.5f, MetricEnumeration.MFA.getAcronym()), new FactorMetric(0.5f, MetricEnumeration.NOP.getAcronym()))); evaluationMap.put(NAME_EFFECTIVENESS, Arrays.asList(new FactorMetric(0.20f, MetricEnumeration.ANA.getAcronym()), new FactorMetric(0.20f, MetricEnumeration.DAM.getAcronym()), new FactorMetric(0.20f, MetricEnumeration.MOA.getAcronym()), new FactorMetric(0.20f, MetricEnumeration.MFA.getAcronym()), new FactorMetric(0.20f, MetricEnumeration.NOP.getAcronym()))); } /** * <QMOOD> Reusability ( -0.25*DCC + 0.25*CAM + 0.50*CIS + 0.50*DSC ) FALTA CAM Flexibility ( +0.25*DAM - 0.25*DCC + 0.50*MOA + 0.50*NOP) Undestandibility ( -0.33*ANA + 0.33*DAM - 0.33*DCC + 0.33*CAM - 0.33*NOP - 0.33*NOM - 0.33*DSC) FALTA CAM Functionality ( +0.12*CAM + 0.22*NOP + 0.22*CIS + 0.22*DSC + 0.22*NOH) FALTA CAM Extendibility ( +0.50*ANA - 0.50*DCC + 0.50*MFA + 0.50*NOP) Effectiveness ( +0.20*ANA + 0.20*DAM + 0.20*MOA + 0.20* MFA + 0.20*NOP) */ public QualityAttributeService() { qualityAttributeDao = ObjectFactory.getObjectWithDataBaseDependencies(QualityAttributeDaoImpl.class); } public List<MetricQualityAttribute> metricsEvaluationToQualityAttribute(QualityAttribute qualityAttribute) throws ServiceException { List<MetricQualityAttribute> metricQualityAttributes = new ArrayList<MetricQualityAttribute>(); List<FactorMetric> factorMetrics = evaluationMap.get(qualityAttribute.getName()); for (FactorMetric factorMetric : factorMetrics) { MetricQualityAttribute mqa = new MetricQualityAttribute(); try { mqa.setMetric(metricService.getByAcronym(factorMetric.metric)); } catch (ObjetoNaoEncontradoException ex) { throw new ServiceException("The Metric [" + factorMetric.metric + "] does not exist"); } mqa.setQualityAttribute(qualityAttribute); mqa.setFactor(factorMetric.factor); metricQualityAttributes.add(mqa); } return metricQualityAttributes; } @Transacional public void save(QualityAttribute qualityAttribute) throws ServiceException { if (qualityAttribute.getId() == null) { qualityAttribute.setMetricQualityAttributes(metricsEvaluationToQualityAttribute(qualityAttribute)); qualityAttributeDao.inclui(qualityAttribute); } else { qualityAttributeDao.altera(qualityAttribute); } } public List<QualityAttribute> getAll() { return qualityAttributeDao.getListaCompleta(); } public QualityAttribute getByName(String name) throws ObjetoNaoEncontradoException{ return qualityAttributeDao.getByName(name); } public Double calculateValue(Revision revision, QualityAttribute attribute) throws ServiceException { List<MetricQualityAttribute> FactorMetrics = attribute.getMetricQualityAttributes(); MetricManagerFactory metricManagerFactory = MetricManagerFactory.getInstance(new ArrayList<Metric>(attribute.getMetricsMap().values())); Double result = 0d; /** * Os arquivos de metricas devem ser utilizados apenas para medicoes especificas de tempo * Ao fazer o experimento os mesmos n devem ser utilizados * Os resultados sao sempre acumulados, portanto, a utilizacao dos mesmos deve ser restrita, de forma a haver entendimento dos dados. */ Archive arquivoGeralMetricas = new Archive(revision.getProject().getConfigurationItem().getName()); Archive arquivoMetricasResumido = new Archive(revision.getProject().getConfigurationItem().getName()+"_metricas"); StringBuilder sb = new StringBuilder(); for (MetricQualityAttribute metricQualityAttribute : FactorMetrics) { long tempo = System.currentTimeMillis(); arquivoGeralMetricas.openAppendAndClose("Antes:"+tempo); arquivoGeralMetricas.openAppendAndClose(metricQualityAttribute.getMetric().getAcronym()); MetricValue metricValue = MeasurementService.extractMetric(metricManagerFactory.getMetricManager(metricQualityAttribute.getMetric()), revision); result += metricQualityAttribute.getFactor()*metricValue.getDoubleValue(); sb.append(result.toString()); sb.append(";"); arquivoGeralMetricas.openAppendAndClose("Tempo Gasto: "+(System.currentTimeMillis()-tempo)); metricQualityAttribute.setMetricValue(metricValue.getDoubleValue()); } arquivoMetricasResumido.openAppendAndClose(sb.toString()); attribute.setCurrentValue(result); return result; } public QualityAttribute getByIdWithMetrics(long idQualityAtributte) throws ObjetoNaoEncontradoException{ return qualityAttributeDao.getByIdWithMetrics(idQualityAtributte); } }