package it.unisa.sesa.repominer.db; import it.unisa.sesa.repominer.db.entities.Metric; import it.unisa.sesa.repominer.db.entities.Project; import it.unisa.sesa.repominer.db.entities.ProjectMetric; import java.sql.Connection; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.List; import net.sf.jeasyorm.BasicEntityManager; import net.sf.jeasyorm.EntityManager; public class ProjectMetricDAO { /** * This method returns a list of project metrics for a project passed as * parameter * * @param pProject * @return A list of ProjectMetric objects */ public List<ProjectMetric> getMetricsOfProject(Project pProject) { Connection connection = ConnectionPool.getInstance().getConnection(); EntityManager em = EntityManager.getInstance(connection); List<ProjectMetric> projectMetrics = em.find(ProjectMetric.class, "where project=?", pProject.getId()); List<Metric> metricsDescription = em .find(Metric.class, "where id in (select metric from project_metrics where project=?)", pProject.getId()); for (int i = 0; i < projectMetrics.size(); i++) { if (metricsDescription.get(i) != null) { projectMetrics.get(i).setDescription( metricsDescription.get(i).getDescription()); projectMetrics.get(i).setId(metricsDescription.get(i).getId()); projectMetrics.get(i).setName( metricsDescription.get(i).getName()); } } ConnectionPool.getInstance().releaseConnection(connection); return projectMetrics; } /** * This method returns a single project metric picked by metric and project * id * * @param pMetric * @param pProject * @return */ public ProjectMetric getMetric(Metric pMetric, Project pProject) { Connection connection = ConnectionPool.getInstance().getConnection(); EntityManager em = EntityManager.getInstance(connection); ProjectMetric projectMetric = em.findUnique(ProjectMetric.class, "where project=? and metric=?", pProject.getId(), pMetric.getId()); projectMetric.setDescription(pMetric.getDescription()); projectMetric.setName(pMetric.getName()); projectMetric.setId(pMetric.getId()); ConnectionPool.getInstance().releaseConnection(connection); return projectMetric; } /** * This method save a project metric into database * * @param pProjectMetric */ public void saveMetric(ProjectMetric pProjectMetric) { Connection connection = ConnectionPool.getInstance().getConnection(); EntityManager em = EntityManager.getInstance(connection); try { connection.setAutoCommit(false); Metric metric = em.findUnique(Metric.class, "where name=?", pProjectMetric.getName()); if (metric == null) { Metric newMetric = new Metric(); newMetric.setDescription(pProjectMetric.getDescription()); newMetric.setName(pProjectMetric.getName()); Integer metricId = new MetricDAO().saveMetric(newMetric); pProjectMetric.setMetricId(metricId); em.insert(pProjectMetric); } else { pProjectMetric.setMetricId(metric.getId()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); BasicEntityManager bem = (BasicEntityManager) em; bem.execute( "delete from project_metrics where project=? and metric=? and `start`=? and `end`=?", pProjectMetric.getProjectId(), pProjectMetric.getMetricId(), sdf.format(pProjectMetric.getStart()), sdf.format(pProjectMetric.getEnd())); // em.delete(pProjectMetric); em.insert(pProjectMetric); } connection.commit(); connection.setAutoCommit(true); } catch (SQLException e) { try { connection.rollback(); connection.setAutoCommit(true); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } ConnectionPool.getInstance().releaseConnection(connection); } }