/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.uff.ic.oceano.ostra.service;
import br.uff.ic.oceano.ostra.model.DataBaseSnapshot;
import br.uff.ic.oceano.core.dao.MetricValueDao;
import br.uff.ic.oceano.core.model.Revision;
import br.uff.ic.oceano.core.model.MetricValue;
import br.uff.ic.oceano.core.model.SoftwareProject;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author DanCastellani
*/
public class DataMiningService {
private static final int PREFIX_GET_SIZE = 3;
private static final int PREFIX_IS_SIZE = 2;
private static final String PREFIX_IS = "is";
private static final String PREFIX_GET = "get";
private static final String SEPARADOR_VALORES = ", ";
public static DataBaseSnapshot getDataBaseSnapshot() {
throw new RuntimeException("Refatorar: DataMiningService.getDataBaseSnapshot()");
// final ProjectDao projectDao = ObjectFactory.getObj(ProjectDaoImpl.class);
// final MetricValueDao metricValueDao = ObjectFactory.getObj(MetricValueDaoImpl.class);
//
// final Map<Revision, List<MetricValue>> metricasPorRevision = montaMapMetricas(metricValueDao);
//
// List<Project> projects = projectDao.getMeasured();
// final ArrayList<String> listaNomesAtributos = getProjectAttributeNames();
// final ArrayList<String> listaInstancias = new ArrayList<String>();
//
// for (Project project : projects) {
// String s = getProjectAtributeValuesByAtributeNames(project, listaNomesAtributos) + getMetricasDoProjetoComSeparador(metricasPorRevision, revision);
// listaInstancias.add(s);
// }
//
// atualizaNomesAtributosComNomesMetricas(listaNomesAtributos, metricasPorRevision);
//
//
// DataBaseSnapshot dbSnapshot = new DataBaseSnapshot(listaInstancias, listaNomesAtributos);
//
// return dbSnapshot;
}
public static String getValueByAtrtibuteName(SoftwareProject project, String attributeName) throws SecurityException {
boolean getMethod = false;
Method method = null;
try {
//tenta pegar o método com prefixo "get"
method = project.getClass().getMethod(PREFIX_GET + attributeName, null);
getMethod = true;
} catch (NoSuchMethodException ex) {
try {
//como não é get, pega com "is", é um boolean.
method = project.getClass().getMethod(PREFIX_IS + attributeName, null);
} catch (NoSuchMethodException ex1) {
Logger.getLogger(DataMiningService.class.getName()).log(Level.SEVERE, null, ex1);
}
} catch (SecurityException ex1) {
Logger.getLogger(DataMiningService.class.getName()).log(Level.SEVERE, null, ex1);
}
String retorno = null;
try {
retorno = "" + method.invoke(project, null);
} catch (IllegalAccessException ex) {
Logger.getLogger(DataMiningService.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(DataMiningService.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(DataMiningService.class.getName()).log(Level.SEVERE, null, ex);
}
return retorno;
}
private static Map<Revision, List<MetricValue>> montaMapMetricas(MetricValueDao metricValueDao) {
final List<MetricValue> metricasExtraidas = metricValueDao.getAllSortedByConfigurationAndMetric();
final Map<Revision, List<MetricValue>> map = new LinkedHashMap<Revision, List<MetricValue>>();
for (MetricValue metricValue : metricasExtraidas) {
//inicializa se necessário
if (map.get(metricValue.getRevision()) == null) {
map.put(metricValue.getRevision(), new ArrayList<MetricValue>());
}
map.get(metricValue.getRevision()).add(metricValue);
}
return map;
}
private static final DataBaseSnapshot getFakeSnapshot() {
//fake
ArrayList<String> listaInstancias = new ArrayList<String>();
listaInstancias.add("13,Contains Cycles,false,Oceano,1.0 beta,dan");
listaInstancias.add("14,Number of Classes,0,Oceano,1.0 beta,dan");
listaInstancias.add("15,Number of Packages,0,Oceano,1.0 beta,dan");
listaInstancias.add("16,Contains Cycles,false,Oceano,metricas desenv,dan");
listaInstancias.add("17,Number of Classes,0,Oceano,metricas desenv,dan");
listaInstancias.add("18,Number of Packages,0,Oceano,metricas desenv,dan");
ArrayList<String> listaAtributos = new ArrayList<String>();
listaAtributos.add("id");
listaAtributos.add("Metrica");
listaAtributos.add("Valor");
listaAtributos.add("Projeto");
listaAtributos.add("Release");
listaAtributos.add("Usuário");
DataBaseSnapshot fakeSnapshot = new DataBaseSnapshot(listaInstancias, listaAtributos);
return fakeSnapshot;
}
public static ArrayList<String> getProjectAttributeNames() {
ArrayList<String> attributeNames = new ArrayList<String>();
for (Method method : SoftwareProject.class.getDeclaredMethods()) {
if (isValid(method)) {
String attributeName = getAttributeName(method);
if (attributeName != null) {
attributeNames.add(attributeName);
}
}
}
Collections.sort(attributeNames);
return attributeNames;
}
private static boolean isValid(Method method) {
if (method.getModifiers() != Modifier.PUBLIC) {
return false;
}
final String name = method.getName();
if (name.startsWith(PREFIX_IS)) {
return true;
}
if (name.startsWith(PREFIX_GET)) {
return true;
}
return false;
}
private static String getAttributeName(Method method) {
String methodName = method.getName();
if (methodName.startsWith(PREFIX_IS)) {
return methodName.substring(PREFIX_IS_SIZE);
} else if (methodName.startsWith(PREFIX_GET)) {
return methodName.substring(PREFIX_GET_SIZE);
}
return null;
}
private static String getProjectAtributeValuesByAtributeNames(SoftwareProject project, ArrayList<String> listaNomesAtributos) {
StringBuilder sb = new StringBuilder();
for (String attributeName : listaNomesAtributos) {
String retorno = SEPARADOR_VALORES + getValueByAtrtibuteName(project, attributeName);
sb.append(retorno);
}
return sb.toString().substring(1);
}
private static String getMetricasDoProjetoComSeparador(Map<Revision, List<MetricValue>> metricasPorRevision, Revision revision) {
StringBuilder sb = new StringBuilder();
for (MetricValue metricValue : metricasPorRevision.get(revision)) {
sb.append(SEPARADOR_VALORES).append(metricValue.getDoubleValue());
}
return sb.toString();
}
private static void atualizaNomesAtributosComNomesMetricas(ArrayList<String> listaNomesAtributos, Map<Revision, List<MetricValue>> metricasPorRevision) {
if (metricasPorRevision.values().isEmpty()) {
return;
}
List<MetricValue> metricValues = metricasPorRevision.values().iterator().next();
for (MetricValue metricValue : metricValues) {
listaNomesAtributos.add(metricValue.getMetric().getName());
}
}
}