diff --git a/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/controller/StatisticsDesignSmellsController.java b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/controller/StatisticsDesignSmellsController.java index 47cb2fba89394ff2dca2f9734fc57e3add4994ff..3b1a587d31091681c8e8736bdfd0fbf3d9f8a5e9 100644 --- a/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/controller/StatisticsDesignSmellsController.java +++ b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/controller/StatisticsDesignSmellsController.java @@ -42,6 +42,9 @@ public class StatisticsDesignSmellsController extends SelectorComposer<Component case "validation_statistics": locationUri = "/pages/user/StatisticsValidation.zul"; break; + case "qFactors_statistics": + locationUri = "/pages/user/StatisticsQualityFactor.zul"; + break; default: alert("Pendiente de implementar la funcionalidad del menu " + menuItemLabel); break; diff --git a/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/controller/StatisticsQualityFactorController.java b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/controller/StatisticsQualityFactorController.java new file mode 100644 index 0000000000000000000000000000000000000000..d83c42cc404fef92a84f63fb25758a8022e9db6b --- /dev/null +++ b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/controller/StatisticsQualityFactorController.java @@ -0,0 +1,130 @@ +package es.uva.inf.tfg.ginquin.smellswisdom.controller; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.carewebframework.ui.highcharts.Axis; +import org.carewebframework.ui.highcharts.Chart; +import org.carewebframework.ui.highcharts.DataPoint; +import org.carewebframework.ui.highcharts.Series; +import org.zkoss.util.resource.Labels; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.select.SelectorComposer; +import org.zkoss.zk.ui.select.annotation.VariableResolver; +import org.zkoss.zk.ui.select.annotation.Wire; +import org.zkoss.zk.ui.select.annotation.WireVariable; +import org.zkoss.zkplus.spring.DelegatingVariableResolver; + +import es.uva.inf.tfg.ginquin.smellswisdom.services.QualityFactorService; + +@VariableResolver(DelegatingVariableResolver.class) +public class StatisticsQualityFactorController extends SelectorComposer<Component> { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @Wire + Chart chart1; + @Wire + Chart chart2; + + @WireVariable + QualityFactorService qFactorService; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + + String title=""; + Map<String, Integer> datos=null; + + //gráfico circular + datos = qFactorService.getStatiticsQualityFactor(); + title= Labels.getLabel("statisticsQFactor.title1"); + createPieChart(title,chart1, datos); + + //gráfico de barras + datos = qFactorService.getStatiticsQualityFactorImpact(); + title= Labels.getLabel("statisticsQFactor.title2"); + createBarChart(title,chart2, datos); + + } + + /** + * Permite crear un gráfico circular. + * @param title titulo del gráfico + * @param compChart componente gráfico donde pintarlo. + * @param datos datos con los que realizar el gráfico. + */ + private void createPieChart(String title,Chart compChart, Map<String, Integer> datos) { + + compChart.setType("pie"); + compChart.setTitle(title); + compChart.options.plotOptions.allowPointSelect=true; + compChart.options.plotOptions.cursor="pointer"; + compChart.options.plotOptions.showInLegend=true; + + compChart.options.plotOptions.dataLabels. + formatter="{return this.point.name+': '+Highcharts.numberFormat(this.percentage, 2)+'%'}"; + + //dividimos el mapa de datos. + List<String> keys = new ArrayList<String>(); + List<Integer> data = new ArrayList<Integer>(); + for (Map.Entry<String, Integer> entry : datos.entrySet()) { + keys.add(entry.getKey()); + data.add(entry.getValue()); + } + //series para el gráfico + Series series = compChart.addSeries(); + series.name = Labels.getLabel("graphic.total"); + + for (int j = 0; j < data.size(); j++) { + DataPoint dataPoint = series.addDataPoint(data.get(j).doubleValue()); + dataPoint.name=keys.get(j); + } + + compChart.run(); + } + + /** + * Permite crear un gráfico de barras. + * @param title titulo del gráfico + * @param compChart componente gráfico donde pintarlo. + * @param datos datos con los que realizar el gráfico. + */ + private void createBarChart(String title,Chart compChart, Map<String, Integer> datos) { + + compChart.setTitle(title); + + //dividimos el mapa de datos. + List<String> keys = new ArrayList<String>(); + List<Integer> data = new ArrayList<Integer>(); + + for (Map.Entry<String, Integer> entry : datos.entrySet()) { + keys.add(entry.getKey()); + data.add(entry.getValue()); + } + + // Creamos las x axis + Axis xAxis = compChart.getXAxis(); + xAxis.categories.addAll(keys); + + //primer yAxis + Axis yAxis = compChart.getYAxis(); + yAxis.title.text = Labels.getLabel("graphic.qFactorFrequency"); + + //serie para el primer yAxis + Series series = compChart.addSeries("column"); + series.name = Labels.getLabel("graphic.frequency"); + + for (int j = 0; j < data.size(); j++) { + series.addDataPoint(j, data.get(j).doubleValue()); + } + + compChart.run(); + } + +} diff --git a/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/QualityFactorService.java b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/QualityFactorService.java new file mode 100644 index 0000000000000000000000000000000000000000..adbfbbac4be225c9e45a81f559cb69ac43f321db --- /dev/null +++ b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/QualityFactorService.java @@ -0,0 +1,19 @@ +package es.uva.inf.tfg.ginquin.smellswisdom.services; + +import java.util.Map; + +public interface QualityFactorService { + + /** + * Permite obtener la distribución de los quality factor mencionados en los design smells. + * @return datos de los quality factor mencionados en los design smells. + */ + Map<String,Integer> getStatiticsQualityFactor(); + + /** + * Permite obtener la distribución de los quality factor sobre los impactos de los design smells. + * @return datos de los quality factor sobre los impactos de los design smells + */ + Map<String,Integer> getStatiticsQualityFactorImpact(); + +} diff --git a/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/impl/QualityFactorDao.java b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/impl/QualityFactorDao.java new file mode 100644 index 0000000000000000000000000000000000000000..48216ff84338013d90327ca08f63a2bb87dbefcb --- /dev/null +++ b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/impl/QualityFactorDao.java @@ -0,0 +1,64 @@ +package es.uva.inf.tfg.ginquin.smellswisdom.services.impl; + +import java.math.BigInteger; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + +import org.springframework.stereotype.Repository; + +@Repository +public class QualityFactorDao { + + @PersistenceContext + private EntityManager em; + + + @SuppressWarnings("unchecked") + public Map<String, Integer> getStatiticsQualityFactor() { + Query query = em.createNativeQuery( + "SELECT qf.qualitymodel,count(*) " + + "FROM qfactorsmell qfs,qualityfactor qf " + + "WHERE qfs.qualityfactor_id=qf.qualityfactor_id " + + "GROUP BY qf.qualitymodel"); + List<Object[]> datos = query.getResultList(); + + Map<String, Integer> map = new TreeMap<>(); + + for (Object[] dato : datos) { + map.put((String) dato[0], ((BigInteger) dato[1]).intValue()); + } + + return map; + } + + @SuppressWarnings("unchecked") + public Map<String,Integer> getStatiticsQualityFactorImpact(){ + Query query = em.createNativeQuery( + "SELECT qf.name,count(*) " + + "FROM qfactorsmell qfs,qualityfactor qf " + + "WHERE qfs.qualityfactor_id=qf.qualityfactor_id " + + "GROUP BY qf.name"); + List<Object[]> datos = query.getResultList(); + + Map<String,Integer> unSortedMap = new TreeMap<>(); + + for (Object[] dato : datos) { + unSortedMap.put((String)dato[0], ((BigInteger)dato[1]).intValue()); + } + + LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>(); + + unSortedMap.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) + .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue())); + + return sortedMap; + } + +} diff --git a/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/impl/QualityFactorServiceImpl.java b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/impl/QualityFactorServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f567ea9b95b30a822dbc9eab666d4fa882f57115 --- /dev/null +++ b/src/main/java/es/uva/inf/tfg/ginquin/smellswisdom/services/impl/QualityFactorServiceImpl.java @@ -0,0 +1,29 @@ +package es.uva.inf.tfg.ginquin.smellswisdom.services.impl; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.stereotype.Service; + +import es.uva.inf.tfg.ginquin.smellswisdom.services.QualityFactorService; + +@Service("qFactorService") +@Scope(value="singleton",proxyMode=ScopedProxyMode.TARGET_CLASS) +public class QualityFactorServiceImpl implements QualityFactorService { + + @Autowired + QualityFactorDao dao; + + @Override + public Map<String, Integer> getStatiticsQualityFactor() { + return dao.getStatiticsQualityFactor(); + } + + @Override + public Map<String, Integer> getStatiticsQualityFactorImpact() { + return dao.getStatiticsQualityFactorImpact(); + } + +} diff --git a/src/main/webapp/WEB-INF/zk-label.properties b/src/main/webapp/WEB-INF/zk-label.properties index e6033ed99608209f420ae3f9fb3c483e6d235342..13f045a53d9910a819b007fb19f1883f86d537b9 100644 --- a/src/main/webapp/WEB-INF/zk-label.properties +++ b/src/main/webapp/WEB-INF/zk-label.properties @@ -177,6 +177,7 @@ statistics.menu.designSmell=Design smells statistics.menu.aprroach=Enfoques statistics.menu.tool=Herramientas statistics.menu.validation=Validación +statistics.menu.qFactor=Factor de calidad #Labels para gráficos graphic.absoFrecuency=Frecuencia absoluta @@ -195,6 +196,7 @@ graphic.toolFrequency=Frecuencia de la herramienta graphic.repreFrequency=Frecuencia de la respresentación graphic.projectFrequency=Frecuencia del proyecto graphic.measureFrequency=Frecuencia de la medida +graphic.qFactorFrequency=Frecuencia del factor de calidad #StatiticsPublication.zul statisticsPubli.title0=Distribución de artículos relevantes a lo largo del período de tiempo por tipo de publicación.. @@ -225,4 +227,8 @@ statisticsTools.title3=Distribución de la representación interna del software statisticsValidation.title1=Distribución de la evidencia de validación sobre los artículos seleccionados. statisticsValidation.title2=Distribución de lenguajes de implementación sobre el número de proyectos. statisticsValidation.title3=Proyectos más utilizados en validación de herramientas/estrategias. -statisticsValidation.title4=Distribución de indicadores de rendimiento o mediciones de calidad utilizadas como evidencia sobre los artículos selecionados. \ No newline at end of file +statisticsValidation.title4=Distribución de indicadores de rendimiento o mediciones de calidad utilizadas como evidencia sobre los artículos selecionados. + +#StatisticsQualityFactor.zul +statisticsQFactor.title1=Distribución de los factores de calidad mencionados con respecto a los Design smells en los artículos relevantes agrupados por modelos de calidad. +statisticsQFactor.title2=Factores de calidad más mencionados como afectados por el número de Design Smells que analizan su impacto en ellos. \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/zk-label_en.properties b/src/main/webapp/WEB-INF/zk-label_en.properties index 3b5f23afe2dde4c8db4670b4a69e07b870efc2d8..68b38a266c5b06c19d30d482794155220374ac0d 100644 --- a/src/main/webapp/WEB-INF/zk-label_en.properties +++ b/src/main/webapp/WEB-INF/zk-label_en.properties @@ -177,6 +177,7 @@ statistics.menu.designSmell=Design smells statistics.menu.aprroach=Approaches statistics.menu.tool=Tools statistics.menu.validation=Validation +statistics.menu.qFactor=Quality factor #Labels para gráficos graphic.absoFrecuency=Absolute frequency @@ -195,6 +196,7 @@ graphic.toolFrequency=Tool frequency graphic.repreFrequency=Representation frequency graphic.projectFrequency=Project frequency graphic.measureFrequency=Measure frequency +graphic.qFactorFrequency=Quality factor frequency #StatiticsPublication.zul statisticsPubli.title0=Distribution of relevant papers over time period per publication type. @@ -225,4 +227,8 @@ statisticsTools.title3=Distribution of internal software representation over the statisticsValidation.title1=Distribution of validation evidence over the selected paper. statisticsValidation.title2=Distribution of implementation languages over the number of projects. statisticsValidation.title3=Most used projects in validation of tools/strategies. -statisticsValidation.title4=Distribution of performance indicators or quality measurements used as evidence over the selected paper. \ No newline at end of file +statisticsValidation.title4=Distribution of performance indicators or quality measurements used as evidence over the selected paper. + +#StatisticsQualityFactor.zul +statisticsQFactor.title1=Distribution of quality factors mentioned regarding the Design Smells in the relevant papers grouped by quality models. +statisticsQFactor.title2=Quality factors most mentioned as affected by the number of Design Smells that analyze their impact on them. \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/zk-label_es.properties b/src/main/webapp/WEB-INF/zk-label_es.properties index e6033ed99608209f420ae3f9fb3c483e6d235342..13f045a53d9910a819b007fb19f1883f86d537b9 100644 --- a/src/main/webapp/WEB-INF/zk-label_es.properties +++ b/src/main/webapp/WEB-INF/zk-label_es.properties @@ -177,6 +177,7 @@ statistics.menu.designSmell=Design smells statistics.menu.aprroach=Enfoques statistics.menu.tool=Herramientas statistics.menu.validation=Validación +statistics.menu.qFactor=Factor de calidad #Labels para gráficos graphic.absoFrecuency=Frecuencia absoluta @@ -195,6 +196,7 @@ graphic.toolFrequency=Frecuencia de la herramienta graphic.repreFrequency=Frecuencia de la respresentación graphic.projectFrequency=Frecuencia del proyecto graphic.measureFrequency=Frecuencia de la medida +graphic.qFactorFrequency=Frecuencia del factor de calidad #StatiticsPublication.zul statisticsPubli.title0=Distribución de artículos relevantes a lo largo del período de tiempo por tipo de publicación.. @@ -225,4 +227,8 @@ statisticsTools.title3=Distribución de la representación interna del software statisticsValidation.title1=Distribución de la evidencia de validación sobre los artículos seleccionados. statisticsValidation.title2=Distribución de lenguajes de implementación sobre el número de proyectos. statisticsValidation.title3=Proyectos más utilizados en validación de herramientas/estrategias. -statisticsValidation.title4=Distribución de indicadores de rendimiento o mediciones de calidad utilizadas como evidencia sobre los artículos selecionados. \ No newline at end of file +statisticsValidation.title4=Distribución de indicadores de rendimiento o mediciones de calidad utilizadas como evidencia sobre los artículos selecionados. + +#StatisticsQualityFactor.zul +statisticsQFactor.title1=Distribución de los factores de calidad mencionados con respecto a los Design smells en los artículos relevantes agrupados por modelos de calidad. +statisticsQFactor.title2=Factores de calidad más mencionados como afectados por el número de Design Smells que analizan su impacto en ellos. \ No newline at end of file diff --git a/src/main/webapp/pages/user/StatisticsDesignSmells.zul b/src/main/webapp/pages/user/StatisticsDesignSmells.zul index 4bc3bcb6ab43ca81c5e53b8cf493029bdf7b07ce..3156064a1d5a3fad17d8f6d163c38a96b426d842 100644 --- a/src/main/webapp/pages/user/StatisticsDesignSmells.zul +++ b/src/main/webapp/pages/user/StatisticsDesignSmells.zul @@ -14,6 +14,8 @@ label="${labels.statistics.menu.tool}" /> <menuitem id="validation_statistics" label="${labels.statistics.menu.validation}" /> + <menuitem id="qFactors_statistics" + label="${labels.statistics.menu.qFactor}" /> </menubar> </div> </west> diff --git a/src/main/webapp/pages/user/StatisticsQualityFactor.zul b/src/main/webapp/pages/user/StatisticsQualityFactor.zul new file mode 100644 index 0000000000000000000000000000000000000000..2f3d961c42c64f94a287b11461bbd7ba4aa6f3b7 --- /dev/null +++ b/src/main/webapp/pages/user/StatisticsQualityFactor.zul @@ -0,0 +1,15 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<div hflex="1" vflex="1" + apply="es.uva.inf.tfg.ginquin.smellswisdom.controller.StatisticsQualityFactorController"> + + <groupbox mold="3d" width="100%"> + <caption label="${labels.statisticsQFactor.title1}"/> + <hchart id="chart1"/> + </groupbox> + + <groupbox mold="3d" width="100%"> + <caption label="${labels.statisticsQFactor.title2}"/> + <hchart id="chart2"/> + </groupbox> + +</div> \ No newline at end of file