/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.core.persistence; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import javax.persistence.NoResultException; import javax.persistence.PersistenceException; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import org.apache.commons.lang.time.DateUtils; import org.eclipse.jubula.client.core.businessprocess.progress.OperationCanceledUtil; import org.eclipse.jubula.client.core.i18n.Messages; import org.eclipse.jubula.client.core.model.IProjectPO; import org.eclipse.jubula.client.core.model.ITestResultSummaryPO; import org.eclipse.jubula.client.core.model.PoMaker; import org.eclipse.jubula.client.core.model.ProjectVersion; import org.eclipse.jubula.tools.internal.exception.JBException; import org.eclipse.jubula.tools.internal.exception.JBFatalException; import org.eclipse.jubula.tools.internal.exception.ProjectDeletedException; import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * PM to handle all test result summaries related Persistence (JPA / EclipseLink) queries * * @author BREDEX GmbH * @created Mar 3, 2010 */ public class TestResultSummaryPM { /** standard logging */ private static Logger log = LoggerFactory.getLogger(TestResultSummaryPM.class); /** name of Test Result Summary's (internal) "GUID" property */ private static final String PROPNAME_GUID = "internalGuid"; //$NON-NLS-1$ /** name of Test Result Summary's (internal) "Project GUID" property */ private static final String PROPNAME_PROJECT_GUID = "internalProjectGuid"; //$NON-NLS-1$ /** name of Test Result Summary's "Project Major Version" property */ private static final String PROPNAME_PROJECT_MAJOR_VERSION = "projectMajorVersion"; //$NON-NLS-1$ /** name of Test Result Summary's "Project Minor Version" property */ private static final String PROPNAME_PROJECT_MINOR_VERSION = "projectMinorVersion"; //$NON-NLS-1$ /** name of Test Result Summary's "Project Micro Version" property */ private static final String PROPNAME_PROJECT_MICRO_VERSION = "projectMicroVersion"; //$NON-NLS-1$ /** name of Test Result Summary's "Project VersionQualifier" property */ private static final String PROPNAME_PROJECT_VERSION_QUALIFIER = "projectVersionQualifier"; //$NON-NLS-1$ /** name of Test Result Summary's "AUT Agent Name" property */ private static final String PROPNAME_AUT_AGENT_NAME = "autAgentName"; //$NON-NLS-1$ /** name of Test Result Summary's "Executed Test Steps" property */ private static final String PROPNAME_EXECUTED_TESTSTEPS = "testsuiteExecutedTeststeps"; //$NON-NLS-1$ /** name of Test Result Summary's "AUT Hostname" property */ private static final String PROPNAME_AUT_HOSTNAME = "autHostname"; //$NON-NLS-1$ /** name of Test Result Summary's "Test Suite Date" property */ private static final String PROPNAME_TESTSUITE_DATE = "testsuiteDate"; //$NON-NLS-1$ /** * hide */ private TestResultSummaryPM() { // empty } /** * @param proj * the project to search in * @param se * the Persistence (JPA / EclipseLink) session to use for query (optional) * @return a list of all test result summaries for the given project for all * available project version * @throws PMException * in case of any DB error. */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static final List<ITestResultSummaryPO> getAllTestResultSummaries( IProjectPO proj, EntityManager se) throws PMException { List<ITestResultSummaryPO> ltrs = null; EntityManager s = null; try { s = se != null ? se : Persistor.instance().openSession(); CriteriaBuilder builder = s.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(); Root from = query.from(PoMaker.getTestResultSummaryClass()); query.select(from).where( builder.equal( from.get(PROPNAME_PROJECT_GUID), proj.getGuid())); ltrs = s.createQuery(query).getResultList(); } catch (PersistenceException e) { OperationCanceledUtil.checkForOperationCanceled(e); PersistenceManager.handleDBExceptionForAnySession(null, e, s); } finally { Persistor.instance().dropSession(s); } return ltrs; } /** * @param proj the project to search in * @param se the Persistence (JPA / EclipseLink) session to use for query (optional) * @param pageNumber the number of pages * @param pageSize the size of page * * @return a list of all test result summaries for the given project for all * available project version * @throws PMException in case of any DB error. */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static final List<ITestResultSummaryPO> getTestResultSummaries( IProjectPO proj, EntityManager se, int pageNumber, int pageSize) throws PMException { List<ITestResultSummaryPO> ltrs = null; EntityManager s = null; try { s = se != null ? se : Persistor.instance().openSession(); CriteriaBuilder builder = s.getCriteriaBuilder(); CriteriaQuery cQuery = builder.createQuery(); Root from = cQuery.from(PoMaker.getTestResultSummaryClass()); cQuery.select(from).where( builder.equal( from.get(PROPNAME_PROJECT_GUID), proj.getGuid())); Query query = s.createQuery(cQuery); query.setFirstResult((pageNumber - 1) * pageSize); query.setMaxResults(pageSize); ltrs = query.getResultList(); } catch (PersistenceException e) { OperationCanceledUtil.checkForOperationCanceled(e); PersistenceManager.handleDBExceptionForAnySession(null, e, s); } finally { Persistor.instance().dropSession(s); } return ltrs; } /** * @param proj currently project * @param se entity manager if there is one * @return the number of test results * @throws PMException */ @SuppressWarnings("unchecked") public static final long countOfTestResultSummaries( IProjectPO proj, EntityManager se) throws PMException { long countOfTestResultSummaries = 0; EntityManager s = null; try { s = se != null ? se : Persistor.instance().openSession(); CriteriaBuilder builder = s.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(); Root from = query.from(PoMaker.getTestResultSummaryClass()); query.select(builder.count(from)).where( builder.equal( from.get(PROPNAME_PROJECT_GUID), proj.getGuid())); Number count = (Number)s.createQuery(query) .getSingleResult(); countOfTestResultSummaries = count.longValue(); } catch (PersistenceException e) { OperationCanceledUtil.checkForOperationCanceled(e); PersistenceManager.handleDBExceptionForAnySession(null, e, s); } finally { Persistor.instance().dropSession(s); } return countOfTestResultSummaries; } /** * store the testresult summary of test run in database * @param summary the testresult summary to store */ public static void storeTestResultSummaryInDB( ITestResultSummaryPO summary) { final EntityManager sess = Persistor.instance().openSession(); try { final EntityTransaction tx = Persistor.instance().getTransaction(sess); sess.persist(summary); Persistor.instance().commitTransaction(sess, tx); } catch (PMException e) { throw new JBFatalException(Messages.StoringOfMetadataFailed, e, MessageIDs.E_DATABASE_GENERAL); } catch (ProjectDeletedException e) { throw new JBFatalException(Messages.StoringOfMetadataFailed, e, MessageIDs.E_PROJECT_NOT_FOUND); } finally { Persistor.instance().dropSession(sess); } } /** * store the all of testresult summaries of test run in database * @param summaries the testresult summaries to store */ public static void storeTestResultSummariesInDB( List<ITestResultSummaryPO> summaries) { final EntityManager sess = Persistor.instance().openSession(); try { final EntityTransaction tx = Persistor.instance().getTransaction(sess); for (ITestResultSummaryPO summary : summaries) { sess.persist(summary); } Persistor.instance().commitTransaction(sess, tx); } catch (PMException e) { throw new JBFatalException(Messages.StoringOfMetadataFailed, e, MessageIDs.E_DATABASE_GENERAL); } catch (ProjectDeletedException e) { throw new JBFatalException(Messages.StoringOfMetadataFailed, e, MessageIDs.E_PROJECT_NOT_FOUND); } finally { Persistor.instance().dropSession(sess); } } /** * saving collected monitoring data into DB. Instead of sess.persist() * sess.merge() is called. * @param summary the testresult summary to store * @return the new managed summary instance */ public static final ITestResultSummaryPO mergeTestResultSummaryInDB( ITestResultSummaryPO summary) { final EntityManager sess = Persistor.instance().openSession(); try { final EntityTransaction tx = Persistor.instance().getTransaction(sess); ITestResultSummaryPO msummary = sess.merge(summary); Persistor.instance().commitTransaction(sess, tx); return msummary; } catch (PMException e) { throw new JBFatalException(Messages.StoringOfMetadataFailed, e, MessageIDs.E_DATABASE_GENERAL); } catch (ProjectDeletedException e) { throw new JBFatalException(Messages.StoringOfMetadataFailed, e, MessageIDs.E_PROJECT_NOT_FOUND); } finally { Persistor.instance().dropSession(sess); } } /** * Checks whether the given Test Result Summary already exists in the * currently connected database. This opens a session in order * to perform the check, and closes the session immediately thereafter. * * @param summary The Test Result Summary to check. * @return <code>true</code> if <code>summary</code> already exists in the * currently connected database. Otherwise <code>false</code>. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static final boolean doesTestResultSummaryExist( ITestResultSummaryPO summary) { final EntityManager sess = Persistor.instance().openSession(); try { CriteriaBuilder builder = sess.getCriteriaBuilder(); CriteriaQuery guidDuplicateQuery = builder.createQuery(); Root guidDuplicateFrom = guidDuplicateQuery.from(PoMaker.getTestResultSummaryClass()); guidDuplicateQuery.select(builder.count(guidDuplicateFrom)).where( builder.equal( guidDuplicateFrom.get(PROPNAME_GUID), summary.getInternalGuid())); Number count = (Number)sess.createQuery(guidDuplicateQuery) .getSingleResult(); if (count.longValue() > 0) { return true; } CriteriaQuery duplicateQuery = builder.createQuery(); Root duplicateFrom = duplicateQuery.from(PoMaker.getTestResultSummaryClass()); duplicateQuery.select(builder.count(duplicateFrom)).where( builder.and( builder.equal( duplicateFrom.get(PROPNAME_TESTSUITE_DATE), summary.getTestsuiteDate()), builder.equal( duplicateFrom.get(PROPNAME_AUT_HOSTNAME), summary.getAutHostname()), builder.equal( duplicateFrom.get(PROPNAME_EXECUTED_TESTSTEPS), summary.getTestsuiteExecutedTeststeps()), builder.equal( duplicateFrom.get(PROPNAME_AUT_AGENT_NAME), summary.getAutAgentName()))); count = (Number)sess.createQuery(duplicateQuery).getSingleResult(); if (count.longValue() > 0) { log.error("Duplicate Test Result Summary (GUID=" //$NON-NLS-1$ + summary.getInternalGuid() + ") will not be imported."); //$NON-NLS-1$ return true; } return false; } finally { Persistor.instance().dropSessionWithoutLockRelease(sess); } } /** * load metadata from database * * @param startTime * the test suite start time for summaries to be included * @return list of metadata objects */ @SuppressWarnings({ "unchecked" }) public static final List<ITestResultSummaryPO> findAllTestResultSummaries( Date startTime) throws JBException { EntityManager session = null; if (Persistor.instance() == null) { return null; } try { session = Persistor.instance().openSession(); Query query = session .createQuery("select s from TestResultSummaryPO as s " + //$NON-NLS-1$ "where s.testsuiteDate > :startTime"); //$NON-NLS-1$ query.setParameter("startTime", startTime); //$NON-NLS-1$ List<ITestResultSummaryPO> metaList = query.getResultList(); return metaList; } catch (PersistenceException e) { log.error(Messages.PersistenceLoadFailed, e); throw new JBException(e.getMessage(), MessageIDs.E_PERSISTENCE_LOAD_FAILED); } finally { Persistor.instance().dropSessionWithoutLockRelease(session); } } /** * get set of test result summary ids older than amount of days * * @param cleanDate * Date * @param projGUID * the project guid * @param majorVersion * the project major version * @param minorVersion * the project minor version * @param microVersion * the project major version number * @param versionQualifier * the project version qualifier * @return set of test result summary ids */ @SuppressWarnings("unchecked") public static final Set<Long> findTestResultSummariesIfHasTestResultsByDate( Date cleanDate, String projGUID, Integer majorVersion, Integer minorVersion, Integer microVersion, String versionQualifier) throws JBException { EntityManager session = null; if (Persistor.instance() == null) { log.error("Error while finding test result summaries. Persistor is null."); //$NON-NLS-1$ return new HashSet<Long>(); } try { session = Persistor.instance().openSession(); StringBuilder queryString = new StringBuilder( "select r.internalTestResultSummaryID from TestResultPO as r " + //$NON-NLS-1$ "where r.internalTestResultSummaryID in " + //$NON-NLS-1$ "(select s.id from TestResultSummaryPO as s " + //$NON-NLS-1$ "where s.testsuiteDate < :cleanDate " + //$NON-NLS-1$ "and s.internalProjectGuid = :projGUID " //$NON-NLS-1$ ); addVersionQueryString(PROPNAME_PROJECT_MAJOR_VERSION, majorVersion, queryString); addVersionQueryString(PROPNAME_PROJECT_MINOR_VERSION, minorVersion, queryString); addVersionQueryString(PROPNAME_PROJECT_MICRO_VERSION, microVersion, queryString); addVersionQueryString(PROPNAME_PROJECT_VERSION_QUALIFIER, versionQualifier, queryString); queryString.append(")"); //$NON-NLS-1$ Query query = session.createQuery(queryString.toString()); query.setParameter("cleanDate", cleanDate); //$NON-NLS-1$ query.setParameter("projGUID", projGUID); //$NON-NLS-1$ checkAndBindValue(PROPNAME_PROJECT_MAJOR_VERSION, majorVersion, query); checkAndBindValue(PROPNAME_PROJECT_MINOR_VERSION, minorVersion, query); checkAndBindValue(PROPNAME_PROJECT_MICRO_VERSION, microVersion, query); checkAndBindValue(PROPNAME_PROJECT_VERSION_QUALIFIER, versionQualifier, query); List<Long> metaList = query.getResultList(); Set<Long> idSet = new HashSet<Long>(metaList); return idSet; } catch (PersistenceException e) { log.error(Messages.PersistenceLoadFailed, e); throw new JBException(e.getMessage(), MessageIDs.E_PERSISTENCE_LOAD_FAILED); } finally { Persistor.instance().dropSessionWithoutLockRelease(session); } } /** * get set of test result summary ids, (independently from having test * results or not) older than amount of days * * @param cleanDate * Date * @param projGUID * the project guid, if not set, all projects will be searched * @param versionNrs * the project versionNrs, if not set, all versions will be * searched * @return set of test result summary ids */ @SuppressWarnings("unchecked") public static final Set<Long> findTestResultSummariesByDate(Date cleanDate, String projGUID, ProjectVersion versionNrs) throws JBException { EntityManager session = null; if (Persistor.instance() == null) { log.error( "Error while finding test result summaries. Persistor is null."); //$NON-NLS-1$ return new HashSet<Long>(); } try { session = Persistor.instance().openSession(); StringBuilder queryString = new StringBuilder( "select s.id from TestResultSummaryPO as s " + //$NON-NLS-1$ "where s.testsuiteDate < :cleanDate " + //$NON-NLS-1$ (projGUID != null ? "and s.internalProjectGuid = :projGUID " //$NON-NLS-1$ : "") //$NON-NLS-1$ ); if (versionNrs != null) { addVersionQueryString(PROPNAME_PROJECT_MAJOR_VERSION, versionNrs.getMajorNumber(), queryString); addVersionQueryString(PROPNAME_PROJECT_MINOR_VERSION, versionNrs.getMinorNumber(), queryString); addVersionQueryString(PROPNAME_PROJECT_MICRO_VERSION, versionNrs.getMicroNumber(), queryString); addVersionQueryString(PROPNAME_PROJECT_VERSION_QUALIFIER, versionNrs.getVersionQualifier(), queryString); } Query query = session.createQuery(queryString.toString()); query.setParameter("cleanDate", cleanDate); //$NON-NLS-1$ if (projGUID != null) { query.setParameter("projGUID", projGUID); //$NON-NLS-1$ } if (versionNrs != null) { checkAndBindValue(PROPNAME_PROJECT_MAJOR_VERSION, versionNrs.getMajorNumber(), query); checkAndBindValue(PROPNAME_PROJECT_MINOR_VERSION, versionNrs.getMinorNumber(), query); checkAndBindValue(PROPNAME_PROJECT_MICRO_VERSION, versionNrs.getMicroNumber(), query); checkAndBindValue(PROPNAME_PROJECT_VERSION_QUALIFIER, versionNrs.getVersionQualifier(), query); } List<Long> metaList = query.getResultList(); Set<Long> idSet = new HashSet<Long>(metaList); return idSet; } catch (PersistenceException e) { log.error(Messages.PersistenceLoadFailed, e); throw new JBException(e.getMessage(), MessageIDs.E_PERSISTENCE_LOAD_FAILED); } finally { Persistor.instance().dropSessionWithoutLockRelease(session); } } /** * delete testruns * @param resultIDs array of test result ids */ public static final void deleteTestruns(Long[] resultIDs) { if (Persistor.instance() == null || resultIDs.length == 0) { return; } for (Long resultID : resultIDs) { deleteTestrun(resultID); } } /** * delete testrun * @param resultID id of test result */ public static final void deleteTestrun(Long resultID) { if (Persistor.instance() == null) { return; } final EntityManager session = Persistor.instance().openSession(); try { final EntityTransaction tx = Persistor.instance() .getTransaction(session); TestResultPM.executeDeleteTestresultOfSummary(session, resultID); Query querySummary = session .createQuery("select s from TestResultSummaryPO as s where s.id = :id"); //$NON-NLS-1$ querySummary.setParameter("id", resultID); //$NON-NLS-1$ try { ITestResultSummaryPO meta = (ITestResultSummaryPO)querySummary.getSingleResult(); session.remove(meta); } catch (NoResultException nre) { // No result found. Nothing to delete. } Persistor.instance().commitTransaction(session, tx); } catch (PMException e) { log.error("Database exception while deleting testresults", e); //$NON-NLS-1$ throw new JBFatalException(Messages.DeleteTestrunMetadataFailed, e, MessageIDs.E_DATABASE_GENERAL); } catch (ProjectDeletedException e) { throw new JBFatalException(Messages.DeleteTestrunMetadataFailed, e, MessageIDs.E_PROJECT_NOT_FOUND); } finally { Persistor.instance().dropSession(session); } } /** * delete testruns by project guid, minor, major version * @param guid project guid * @param version the project version which testruns should be deleted * @param deleteOnlyDetails true, if only testrun details will * be deleted, summaries will not be deleted */ @SuppressWarnings("unchecked") public static final void deleteTestrunsByProject(String guid, ProjectVersion version, boolean deleteOnlyDetails) { if (Persistor.instance() == null) { return; } final EntityManager session = Persistor.instance().openSession(); try { final EntityTransaction tx = Persistor.instance() .getTransaction(session); StringBuilder queryBuilder = new StringBuilder(); queryBuilder .append("select s from TestResultSummaryPO as s where s.") //$NON-NLS-1$ .append(PROPNAME_PROJECT_GUID).append(" = :guid"); //$NON-NLS-1$ if (version != null) { addVersionQueryString(PROPNAME_PROJECT_MAJOR_VERSION, version.getMajorNumber(), queryBuilder); addVersionQueryString(PROPNAME_PROJECT_MINOR_VERSION, version.getMinorNumber(), queryBuilder); addVersionQueryString(PROPNAME_PROJECT_MICRO_VERSION, version.getMicroNumber(), queryBuilder); addVersionQueryString(PROPNAME_PROJECT_VERSION_QUALIFIER, version.getVersionQualifier(), queryBuilder); } Query querySummary = session.createQuery(queryBuilder.toString()); querySummary.setParameter("guid", guid); //$NON-NLS-1$ if (version != null) { checkAndBindValue(PROPNAME_PROJECT_MAJOR_VERSION, version.getMajorNumber(), querySummary); checkAndBindValue(PROPNAME_PROJECT_MINOR_VERSION, version.getMinorNumber(), querySummary); checkAndBindValue(PROPNAME_PROJECT_MICRO_VERSION, version.getMicroNumber(), querySummary); checkAndBindValue(PROPNAME_PROJECT_VERSION_QUALIFIER, version.getVersionQualifier(), querySummary); } List<ITestResultSummaryPO> summaryList = querySummary .getResultList(); for (ITestResultSummaryPO summary : summaryList) { TestResultPM.executeDeleteTestresultOfSummary( session, summary.getId()); if (!deleteOnlyDetails) { session.remove(summary); } } Persistor.instance().commitTransaction(session, tx); } catch (PMException e) { log.error("Database exception while deleting testresults", e); //$NON-NLS-1$ throw new JBFatalException(Messages.DeleteTestrunFailed, e, MessageIDs.E_DATABASE_GENERAL); } catch (ProjectDeletedException e) { throw new JBFatalException(Messages.DeleteTestrunFailed, e, MessageIDs.E_PROJECT_NOT_FOUND); } finally { Persistor.instance().dropSession(session); } } /** * Cheks if the property has a value and binds the the * specified propertyname the value if its not null * @param propertyname name of the property * @param propertyvalue the property object * @param query the query */ private static void checkAndBindValue(String propertyname, Object propertyvalue, Query query) { if (propertyvalue != null) { query.setParameter(propertyname, propertyvalue); } } /** * Adds the version selection part to the query string * @param propertyname the name of the property * @param propertyvalue the value of the property, only to check if it should be a null check * @param queryBuilder the query string */ private static void addVersionQueryString(String propertyname, Object propertyvalue, StringBuilder queryBuilder) { queryBuilder.append(" and s."); //$NON-NLS-1$ if (propertyvalue != null) { queryBuilder.append(propertyname).append(" = :")//$NON-NLS-1$ .append(propertyname); } else { queryBuilder.append(propertyname).append(" IS NULL"); //$NON-NLS-1$ } } /** * delete all testresult summaries */ public static final void deleteAllTestresultSummaries() { if (Persistor.instance() == null) { return; } final EntityManager session = Persistor.instance().openSession(); try { final EntityTransaction tx = Persistor.instance() .getTransaction(session); Query query = session.createQuery("delete from TestResultSummaryPO as s"); //$NON-NLS-1$ query.executeUpdate(); Persistor.instance().commitTransaction(session, tx); } catch (PMException e) { throw new JBFatalException(Messages.DeleteAllTestrunSummariesFailed, e, MessageIDs.E_DATABASE_GENERAL); } catch (ProjectDeletedException e) { throw new JBFatalException(Messages.DeleteAllTestrunSummariesFailed, e, MessageIDs.E_PROJECT_NOT_FOUND); } finally { Persistor.instance().dropSession(session); } } /** * Delete test-result summaries older than the given days * * @param days * days * @param projGUID * the project guid * @param versionNrs * the project version numbers * @param keepTRSummaries * if true, test-result-summaries will not be deleted */ public static final void cleanTestResultSummaries(int days, String projGUID, ProjectVersion versionNrs, boolean keepTRSummaries) { Date cleanDate = DateUtils.addDays(new Date(), days * -1); final EntityManager session = Persistor.instance().openSession(); try { final EntityTransaction tx = Persistor.instance() .getTransaction(session); Set<Long> summaries = TestResultSummaryPM .findTestResultSummariesByDate(cleanDate, projGUID, versionNrs); for (Long summaryId : summaries) { TestResultPM.executeDeleteTestresultOfSummary(session, summaryId); if (!keepTRSummaries) { Query querySummary = session.createQuery( "select s from TestResultSummaryPO as s where s.id = :id"); //$NON-NLS-1$ querySummary.setParameter("id", summaryId); //$NON-NLS-1$ try { ITestResultSummaryPO meta = (ITestResultSummaryPO) querySummary.getSingleResult(); session.remove(meta); } catch (NoResultException nre) { // No result found. Nothing to delete. } } } Persistor.instance().commitTransaction(session, tx); } catch (PMException e) { log.error("Database exception while deleting testresults", e); //$NON-NLS-1$ throw new JBFatalException(Messages.DeleteTestrunMetadataFailed, e, MessageIDs.E_DATABASE_GENERAL); } catch (ProjectDeletedException e) { throw new JBFatalException(Messages.DeleteTestrunMetadataFailed, e, MessageIDs.E_PROJECT_NOT_FOUND); } catch (JBException e) { throw new JBFatalException(Messages.DeletingTestresultsFailed, e, MessageIDs.E_DELETE_TESTRESULT); } finally { Persistor.instance().dropSession(session); } } }