package it.unisa.sesa.repominer.db; import it.unisa.sesa.repominer.db.entities.Metric; import it.unisa.sesa.repominer.db.entities.PackageMetric; import it.unisa.sesa.repominer.db.entities.SourceContainer; 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; import net.sf.jeasyorm.RuntimeSQLException; public class PackageMetricDAO { /** * This method returns a list of package metrics for package as parameter * * @param pSourceContainer * @return A list of PackageMetric objects */ public List<PackageMetric> getMetricsOfPackage( SourceContainer pSourceContainer) { Connection connection = ConnectionPool.getInstance().getConnection(); EntityManager em = EntityManager.getInstance(connection); List<PackageMetric> packageMetrics = em.find(PackageMetric.class, "where source_container=?", pSourceContainer.getId()); List<Metric> metricsDescription = em .find(Metric.class, "where id in (select metric from package_metrics where package=?)", pSourceContainer.getId()); for (int i = 0; i < packageMetrics.size(); i++) { if (metricsDescription.get(i) != null) { packageMetrics.get(i).setDescription( metricsDescription.get(i).getDescription()); packageMetrics.get(i).setId(metricsDescription.get(i).getId()); packageMetrics.get(i).setName( metricsDescription.get(i).getName()); } } ConnectionPool.getInstance().releaseConnection(connection); return packageMetrics; } /** * This method return a single package metric picked by metric and package * id * * @param pMetric * @param pSourceContainer * @return A PackageMetric object */ public PackageMetric getMetric(Metric pMetric, SourceContainer pSourceContainer) { Connection connection = ConnectionPool.getInstance().getConnection(); EntityManager em = EntityManager.getInstance(connection); PackageMetric projectMetric = em.findUnique(PackageMetric.class, "where source_container=? and metric=?", pSourceContainer.getId(), pMetric.getId()); projectMetric.setDescription(pMetric.getDescription()); projectMetric.setName(pMetric.getName()); projectMetric.setId(pMetric.getId()); ConnectionPool.getInstance().releaseConnection(connection); return projectMetric; } /** * This method saves or update a package metric into database * * @param pPackageMetric */ public void saveMetric(PackageMetric pPackageMetric) { Connection connection = ConnectionPool.getInstance().getConnection(); EntityManager em = EntityManager.getInstance(connection); try { connection.setAutoCommit(false); Metric metric = em.findUnique(Metric.class, "where name=?", pPackageMetric.getName()); if (metric == null) { Metric newMetric = new Metric(); newMetric.setDescription(pPackageMetric.getDescription()); newMetric.setName(pPackageMetric.getName()); Integer metricId = new MetricDAO().saveMetric(newMetric); pPackageMetric.setMetricId(metricId); em.insert(pPackageMetric); } else { pPackageMetric.setMetricId(metric.getId()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); BasicEntityManager bem = (BasicEntityManager) em; bem.execute( "delete from package_metrics where source_container=? and metric=? and `start`=? and `end`=?", pPackageMetric.getPackageId(), pPackageMetric.getMetricId(), sdf.format(pPackageMetric.getStart()), sdf.format(pPackageMetric.getEnd())); em.insert(pPackageMetric); } connection.commit(); connection.setAutoCommit(true); } catch (RuntimeSQLException e) { e.printStackTrace(); } catch (SQLException e) { try { connection.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } ConnectionPool.getInstance().releaseConnection(connection); } }