diff --git a/alitheia/core/pom.xml b/alitheia/core/pom.xml
index 4203d2dda..74600386a 100644
--- a/alitheia/core/pom.xml
+++ b/alitheia/core/pom.xml
@@ -63,7 +63,83 @@
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.7.2.201409121644
+
+
+
+ pre-unit-test
+
+ prepare-agent
+
+
+
+ ${project.build.directory}/coverage-reports/jacoco-ut.exec
+
+ surefireArgLine
+
+
+
+
+ post-unit-test
+ test
+
+ report
+
+
+
+ ${project.build.directory}/coverage-reports/jacoco-ut.exec
+
+ ${project.reporting.outputDirectory}/jacoco-ut
+
+
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+ org.jacoco
+
+ jacoco-maven-plugin
+
+
+ [0.7.2.201409121644,)
+
+
+ prepare-agent
+
+
+
+
+
+
+
+
+
+
+
+
@@ -176,6 +252,18 @@
1.9.5
test
+
+ com.h2database
+ h2
+ 1.4.184
+ test
+
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+ test
+
diff --git a/alitheia/core/src/main/java/eu/sqooss/core/AlitheiaCore.java b/alitheia/core/src/main/java/eu/sqooss/core/AlitheiaCore.java
index 63610d55f..d55d062a7 100644
--- a/alitheia/core/src/main/java/eu/sqooss/core/AlitheiaCore.java
+++ b/alitheia/core/src/main/java/eu/sqooss/core/AlitheiaCore.java
@@ -162,6 +162,10 @@ public static AlitheiaCore testInstance() {
return instance;
}
+ public static void setTestInstance(AlitheiaCore testInstance) {
+ instance = testInstance;
+ }
+
/**
* Register an external implementation of an AlitheiaCore service. It
* will override any internally defined implementation.
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/admin/AdminServiceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/admin/AdminServiceImpl.java
index bcd0f6556..88de58f37 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/admin/AdminServiceImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/admin/AdminServiceImpl.java
@@ -100,9 +100,9 @@ public void execute(AdminAction a) {
DBService db = null;
if (AlitheiaCore.getInstance() != null) {
db = AlitheiaCore.getInstance().getDBService();
- if (db.isDBSessionActive() != true) {
+ if (db.getSessionManager().isDBSessionActive() != true) {
commitDB = true;
- db.startDBSession();
+ db.getSessionManager().startDBSession();
}
}
@@ -111,14 +111,14 @@ public void execute(AdminAction a) {
a.execute();
} catch (Exception e) {
if ((db != null) && commitDB)
- db.rollbackDBSession();
+ db.getSessionManager().rollbackDBSession();
err("Error executing action " + a.mnemonic() + ", id " + a.id() +
"\nCause:" + e.getMessage(), e);
} finally {
ActionContainer ac = liveactions.get(a.id());
if (db != null)
- if (db.isDBSessionActive() && commitDB)
- db.commitDBSession();
+ if (db.getSessionManager().isDBSessionActive() && commitDB)
+ db.getSessionManager().commitDBSession();
ac.end = System.currentTimeMillis();
debug("Action " + a.id() + " finished in " + (ac.end - ac.start) + " msec" );
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/cluster/ClusterNodeServiceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/cluster/ClusterNodeServiceImpl.java
index 5f8f77478..ba590cc59 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/cluster/ClusterNodeServiceImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/cluster/ClusterNodeServiceImpl.java
@@ -55,6 +55,7 @@
import eu.sqooss.service.cluster.ClusterNodeService;
import eu.sqooss.service.db.ClusterNode;
import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.HQLQueryInterface;
import eu.sqooss.service.db.StoredProject;
import eu.sqooss.service.logging.Logger;
import eu.sqooss.service.updater.UpdaterService;
@@ -160,9 +161,9 @@ public boolean assignProject(StoredProject project) throws ClusterNodeActionExce
* @param projectname project's name to assign
*/
public boolean assignProject(String projectname) throws ClusterNodeActionException {
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
StoredProject project = StoredProject.getProjectByName(projectname);
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
if (project == null) {
//the project was not found, can't be assign
String errorMessage = "The project [" + projectname + "] was not found";
@@ -275,9 +276,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
// If empty, assign it to this clusternode
// Example: http://localhost:8088/clusternode?action=assign_project&projectname=iTALC&clusternode=sqoserver1
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
project = StoredProject.getProjectByName(projectname);
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
if (project==null) {
if (projectid!=null) {
long id = 0;
@@ -288,9 +289,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
sendXMLResponse(response, HttpServletResponse.SC_BAD_REQUEST, content);
break;
}
- dbs.startDBSession();
- project = dbs.findObjectById(StoredProject.class, id);
- dbs.rollbackDBSession();
+ dbs.getSessionManager().startDBSession();
+ project = dbs.getQueryInterface().findObjectById(StoredProject.class, id);
+ dbs.getSessionManager().rollbackDBSession();
if (project==null) {
content = createXMLResponse(null,"Project with id:" + projectid + " not found", HttpServletResponse.SC_NOT_FOUND);
sendXMLResponse(response, HttpServletResponse.SC_NOT_FOUND, content);
@@ -306,9 +307,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
if (clusternode==null) {
node = thisNode;
} else {
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
node = ClusterNode.getClusteNodeByName(clusternode);
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
if (node==null) {
content = createXMLResponse(null,"ClusterNode " + clusternode + " not found", HttpServletResponse.SC_NOT_FOUND);
sendXMLResponse(response, HttpServletResponse.SC_NOT_FOUND, content);
@@ -335,9 +336,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
if (clusternode==null) {
node = thisNode;
} else {
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
node = ClusterNode.getClusteNodeByName(clusternode);
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
}
if (node==null){
content = createXMLResponse(null, "ClusterNode "+clusternode+" not found", HttpServletResponse.SC_NOT_FOUND);
@@ -346,7 +347,7 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
}
bcontent = new StringBuilder();
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
Set assignments = ClusterNode.thisNode().getProjects();
if ((assignments!=null) && (assignments.size()>0) ){
bcontent.append("\n");
@@ -357,7 +358,7 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
bcontent.append(">" + sp.getName() + "\n");
}
}
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
content = createXMLResponse(bcontent.toString(), "Project list processed succesfuly", HttpServletResponse.SC_OK);
sendXMLResponse(response, HttpServletResponse.SC_OK, content);
break;
@@ -365,15 +366,15 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
// valid parameters: No need for parameters!
// Example: http://localhost:8088/clusternode?action=get_known_servers
bcontent = new StringBuilder();
- dbs.startDBSession();
- List nodes = (List) dbs.doHQL("FROM ClusterNode",null);
+ dbs.getSessionManager().startDBSession();
+ List nodes = (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL("FROM ClusterNode",null);
if ((nodes!=null) && (nodes.size()>0) ){
bcontent.append("\n");
for (ClusterNode cn : nodes) {
bcontent.append("" + cn.getName() + "\n");
}
}
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
content = createXMLResponse(bcontent.toString(), "Clusternode list processed succesfuly", HttpServletResponse.SC_OK);
sendXMLResponse(response, HttpServletResponse.SC_OK, content);
break;
@@ -429,31 +430,31 @@ public boolean startUp() {
// At this point, this ClusterNode has not been registered to the
// database yet, so do it!
if (thisNode == null) { // paranoia check
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
// Check if previously registered in DB
Map serverProps = new HashMap(1);
serverProps.put("name", localServerName);
- List s = dbs.findObjectsByProperties(
+ List s = dbs.getQueryInterface().findObjectsByProperties(
ClusterNode.class, serverProps);
if (s.isEmpty()) {
// not registered yet, create a record in DB
thisNode = new ClusterNode();
thisNode.setName(localServerName);
- if (!dbs.addRecord(thisNode)) {
+ if (!dbs.getQueryInterface().addRecord(thisNode)) {
logger.error("Failed to register ClusterNode <"
+ localServerName + ">");
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
return false;
} else {
- dbs.commitDBSession();
+ dbs.getSessionManager().commitDBSession();
logger.info("ClusterNode <" + localServerName
+ "> registered succesfully.");
return true;
}
} else {
// already registered, keep the record from DB
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
thisNode = s.get(0);
logger.info("ClusterNode <" + localServerName
+ "> registered succesfully.");
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/db/DBServiceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/DBServiceImpl.java
index 546b4addd..65e122994 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/db/DBServiceImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/DBServiceImpl.java
@@ -36,35 +36,32 @@
import java.io.File;
import java.io.FilenameFilter;
-import java.net.URL;
import java.net.URI;
+import java.net.URL;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
-import org.hibernate.HibernateException;
-import org.hibernate.LockMode;
-import org.hibernate.QueryException;
-import org.hibernate.JDBCException;
-import org.hibernate.Query;
-import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Configuration;
import org.osgi.framework.BundleContext;
import eu.sqooss.core.AlitheiaCoreService;
-import eu.sqooss.service.db.DAObject;
import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.DBSessionManager;
+import eu.sqooss.service.db.DBSessionValidation;
+import eu.sqooss.service.db.HQLQueryInterface;
+import eu.sqooss.service.db.QueryInterface;
+import eu.sqooss.service.db.QueryInterfaceFactory;
+import eu.sqooss.service.db.SQLQueryInterface;
import eu.sqooss.service.logging.Logger;
import eu.sqooss.service.util.URIUtills;
@@ -125,52 +122,12 @@ public class DBServiceImpl implements DBService, AlitheiaCoreService {
private BundleContext bc = null;
private AtomicBoolean isInitialised = new AtomicBoolean(false);
private Properties conProp = new Properties();
+ private DBSessionManager sessionManager = null;
+ private DBSessionValidation sessionValidation = null;
- private void logSQLException(SQLException e) {
-
- while (e != null) {
- String message = String.format("SQLException: SQL State:%s, Error Code:%d, Message:%s",
- e.getSQLState(), e.getErrorCode(), e.getMessage());
- logger.warn(message);
- e = e.getNextException();
- }
- }
-
- private void logExceptionAndTerminateSession( Exception e ) {
- if ( e instanceof JDBCException ) {
- JDBCException jdbce = (JDBCException) e;
- logSQLException(jdbce.getSQLException());
- }
- logger.warn("Exception caught during database session: " + e.getMessage()
- + ". Rolling back current transaction and terminating session...");
- e.printStackTrace();
- Session s = null;
- try {
- s = sessionFactory.getCurrentSession();
- s.getTransaction().rollback();
- } catch (HibernateException e1) {
- logger.error("Error while rolling back failed transaction :" + e1.getMessage());
- if ( s != null ) {
- try {
- s.close();
- } catch ( HibernateException e2) {}
- }
- }
-
- }
-
- private boolean checkSession() {
- if ( !isDBSessionActive() ) {
- logger.warn("Trying to call a DBService method without an active session");
- try {
- throw new Exception("No active session.");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
- return true;
- }
+ private Map, Class extends QueryInterfaceFactory>>>
+ queryInterfaceFactories = new HashMap<>();
+ private Map, QueryInterface> queryInterfaces = new HashMap<>();
private boolean getJDBCConnection() {
String driver = conProp.getProperty("hibernate.connection.driver_class");
@@ -190,7 +147,7 @@ private boolean getJDBCConnection() {
return false;
} catch (SQLException e) {
logger.error("Failed to register driver " + driver);
- logSQLException(e);
+ sessionValidation.logSQLException(e);
return false;
}
@@ -205,7 +162,7 @@ private boolean getJDBCConnection() {
} catch (SQLException e) {
logger.error("Unable to connect to DB URL " +
conProp.getProperty("hibernate.connection.url"));
- logSQLException(e);
+ sessionValidation.logSQLException(e);
return false;
}
}
@@ -273,6 +230,10 @@ public boolean accept(File dir, String name) {
}
sessionFactory = c.buildSessionFactory();
+ DBSessionManagerImpl ssm = new DBSessionManagerImpl(sessionFactory, logger, isInitialised);
+ sessionManager = ssm;
+ sessionValidation = ssm;
+
if (sessionFactory == null)
return false;
} catch (Throwable e) {
@@ -283,12 +244,19 @@ public boolean accept(File dir, String name) {
return true;
}
+ private void preloadFactories() {
+ registerQueryInterface(QueryInterface.class, HQLQueryInterfaceImpl.Factory.class);
+ registerQueryInterface(HQLQueryInterface.class, HQLQueryInterfaceImpl.Factory.class);
+ registerQueryInterface(SQLQueryInterface.class, SQLQueryInterfaceImpl.Factory.class);
+ }
+
public DBServiceImpl() { }
public DBServiceImpl(Properties p, URL configFileURL, Logger l) {
this.conProp = p;
this.logger = l;
initHibernate(configFileURL);
+ preloadFactories();
isInitialised.compareAndSet(false, true);
instance = this;
}
@@ -298,480 +266,10 @@ public static DBService getInstance() {
instance = new DBServiceImpl();
return instance;
}
-
- public T findObjectById(Class daoClass, long id) {
- return doFindObjectById(daoClass, id, false);
- }
-
- public T findObjectByIdForUpdate(Class daoClass, long id) {
- return doFindObjectById(daoClass, id, true);
- }
-
- @SuppressWarnings("unchecked")
- private T doFindObjectById(Class daoClass, long id, boolean useLock) {
- if ( !checkSession() )
- return null;
-
- try {
- Session s = sessionFactory.getCurrentSession();
- return (T) (useLock ? s.get(daoClass, id, LockMode.UPGRADE) : s.get(daoClass, id));
- } catch (HibernateException e) {
- logExceptionAndTerminateSession(e);
- return null;
- }
- }
-
- public List findObjectsByProperties(Class daoClass, Map properties) {
- return doFindObjectsByProperties(daoClass, properties, false);
- }
-
- public List findObjectsByPropertiesForUpdate(Class daoClass, Map properties) {
- return doFindObjectsByProperties(daoClass, properties, true);
- }
-
- @SuppressWarnings("unchecked")
- private List doFindObjectsByProperties(Class daoClass, Map properties, boolean useLock) {
- if( !checkSession() )
- return Collections.emptyList();
-
- // TODO maybe check that the properties are valid (e.g. with java.bean.PropertyDescriptor)
-
- Map parameterMap = new HashMap();
- StringBuffer whereClause = new StringBuffer();
- for (String key : properties.keySet()) {
- whereClause.append( whereClause.length() == 0 ? " where " : " and " );
- // We use "foo" as the name of the object
- whereClause.append("foo" + "." + key + "=:_" + key );
- parameterMap.put( "_" + key, properties.get(key) );
- }
- try {
- // We use "foo" as the name of the object
- return (List) doHQL( "from " + daoClass.getName() + " as foo " + whereClause, parameterMap, useLock );
- } catch (QueryException e) {
- logger.warn("findObjectsByProperties(): invalid properties map. Restarting session...");
- // Automatically restart a session
- // (just be careful with preloaded DAOs that become detached)
- startDBSession();
- return Collections.emptyList();
- }
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doSQL(java.lang.String)
- */
- public List> doSQL(String sql)
- throws SQLException {
- return doSQL(sql, null);
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doSQL(java.lang.String, java.util.Map)
- */
- public List> doSQL(String sql, Map params)
- throws SQLException, QueryException {
- boolean autoSession = !isDBSessionActive();
- try {
- Session s = sessionFactory.getCurrentSession();
- if (autoSession) {
- s.beginTransaction();
- }
- Query query = s.createSQLQuery(sql);
- if ( params != null ) {
- for ( String param : params.keySet() ) {
- query.setParameter(param, params.get(param));
- }
- }
- List> result = query.list();
- if (autoSession) {
- s.getTransaction().commit();
- }
- return result;
- } catch ( JDBCException e ) {
- logExceptionAndTerminateSession(e);
- throw e.getSQLException();
- } catch ( QueryException e ) {
- logExceptionAndTerminateSession(e);
- throw e;
- } catch( HibernateException e ) {
- logExceptionAndTerminateSession(e);
- return Collections.emptyList();
- }
- }
-
- public int callProcedure(String procName, List args, Map params)
- throws SQLException, QueryException {
- boolean autoSession = !isDBSessionActive();
- StringBuilder sql = new StringBuilder("call " + procName + "(");
-
- for (String arg : args) {
- sql.append(":").append(arg).append(",");
- }
- sql.deleteCharAt(sql.lastIndexOf(",")).append(")");
-
- try {
- Session s = sessionFactory.getCurrentSession();
- if (autoSession) {
- s.beginTransaction();
- }
- Query query = s.createSQLQuery(sql.toString());
- if (params != null) {
- for (String param : params.keySet()) {
- query.setParameter(param, params.get(param));
- }
- }
- int result = query.executeUpdate();
- if (autoSession) {
- s.getTransaction().commit();
- }
- return result;
- } catch (JDBCException e) {
- logExceptionAndTerminateSession(e);
- throw e.getSQLException();
- } catch (QueryException e) {
- logExceptionAndTerminateSession(e);
- throw e;
- } catch (HibernateException e) {
- logExceptionAndTerminateSession(e);
- throw e;
- }
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doHQL(java.lang.String)
- */
- public List> doHQL(String hql)
- throws QueryException {
- return doHQL(hql, null, null, false, -1, -1);
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doHQL(java.lang.String, java.util.Map)
- */
- public List> doHQL(String hql, Map params)
- throws QueryException {
- return doHQL(hql, params, null, false, -1, -1);
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doHQL(java.lang.String, java.util.Map, int)
- */
- public List> doHQL(String hql, Map params, int limit)
- throws QueryException {
- return doHQL(hql, params, null, false, 0, limit);
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doHQL(java.lang.String, java.util.Map, boolean)
- */
- public List> doHQL(String hql, Map params, boolean lockForUpdate)
- throws QueryException {
- return doHQL(hql, params, null, lockForUpdate, -1, -1);
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doHQL(java.lang.String, java.util.Map, java.util.Map)
- */
- public List> doHQL(String hql, Map params,
- Map collectionParams)
- throws QueryException {
- return doHQL(hql, params, collectionParams, false, -1, -1);
- }
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#doHQL(java.lang.String, java.util.Map, java.util.Map, boolean, int, int)
- */
- public List> doHQL(String hql, Map params,
- Map collectionParams, boolean lockForUpdate, int start, int limit)
- throws QueryException {
- if ( !checkSession() ) {
- return Collections.emptyList();
- }
- try {
- Session s = sessionFactory.getCurrentSession();
- Query query = s.createQuery(hql);
- if (params != null) {
- for ( String param : params.keySet() ) {
- query.setParameter(param, params.get(param));
- }
- }
- if (collectionParams != null) {
- for ( String param : collectionParams.keySet() ) {
- query.setParameterList(param, collectionParams.get(param));
- }
- }
- if (lockForUpdate) {
- query.setLockMode("foo", LockMode.PESSIMISTIC_WRITE);
- }
- if ( start >= 0 && limit >= 0 ) {
- query.setFirstResult(start);
- query.setMaxResults(limit);
- }
- return query.list();
- } catch ( QueryException e ) {
- logExceptionAndTerminateSession(e);
- throw e;
- } catch( HibernateException e ) {
- logExceptionAndTerminateSession(e);
- return Collections.emptyList();
- } catch (ClassCastException e) {
- // Throw a QueryException instead of forwarding the ClassCastException
- // it's more explicit
- QueryException ebis = new QueryException("Invalid HQL query parameter type: "
- + e.getMessage(), e);
- logExceptionAndTerminateSession(ebis);
- throw ebis;
- }
-
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#addRecord(eu.sqooss.service.db.DAObject)
- */
- public boolean addRecord(DAObject record) {
- ArrayList tmpList = new ArrayList(1);
- tmpList.add(record);
- return addRecords(tmpList);
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#deleteRecord(eu.sqooss.service.db.DAObject)
- */
- public boolean deleteRecord(DAObject record) {
- ArrayList tmpList = new ArrayList(1);
- tmpList.add(record);
- return deleteRecords(tmpList);
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#addRecords(java.util.List)
- */
- public boolean addRecords(List records) {
- if( !checkSession() )
- return false;
-
- DAObject lastRecord = null;
- try {
- Session s = sessionFactory.getCurrentSession();
- for (DAObject record : records) {
- lastRecord = record;
- s.save(record);
- }
- lastRecord = null;
- s.flush();
- return true;
- } catch (HibernateException e) {
- if (lastRecord != null) {
- logger.error("Failed to add object "
- + "[" + lastRecord.getClass().getName() + ":" + lastRecord.getId() + "]"
- + " to the database: " + e.getMessage());
- }
- logExceptionAndTerminateSession(e);
- return false;
- }
- }
-
- /* (non-Javadoc)
- * @see eu.sqooss.service.db.DBService#deleteRecords(java.util.List)
- */
- public boolean deleteRecords(List records) {
- if( !checkSession() )
- return false;
-
- DAObject lastRecord = null;
- try {
- Session s = sessionFactory.getCurrentSession();
- for (DAObject record : records) {
- lastRecord = record;
- s.delete(record);
- }
- lastRecord = null;
- s.flush();
- return true;
- } catch (HibernateException e) {
- if (lastRecord != null) {
- logger.error("Failed to remove object "
- + "[" + lastRecord.getClass().getName() + ":" + lastRecord.getId() + "]"
- + " from the database: " + e.getMessage());
- }
- logExceptionAndTerminateSession(e);
- return false;
- }
- }
public Logger logger() {
return this.logger;
- }
-
- public boolean startDBSession() {
- //Boot time check
- if(isInitialised.get() == false) {
- return false;
- }
-
- if( isDBSessionActive() ) {
- logger.debug("startDBSession() - a session was already started for that thread");
- return true;
- }
-
- Session s = null;
- try {
- s = sessionFactory.getCurrentSession();
- //logger.debug("startDBSession: " + s + "[hashcode=" + s.hashCode() + ",open=" + s.isOpen() + "]");
- s.beginTransaction();
- } catch (HibernateException e) {
- logger.error("startDBSession() - error while initializing session: " + e.getMessage());
- if ( s != null ) {
- try {
- s.close();
- } catch (HibernateException e1) {
- }
- }
- return false;
- }
- return true;
- }
-
- public boolean commitDBSession() {
- if ( !checkSession() )
- return false;
-
- Session s = null;
- try {
- s = sessionFactory.getCurrentSession();
- //logger.debug("commitDBSession: " + s + "[hashcode=" + s.hashCode() + ",open=" + s.isOpen() + "]");
- s.getTransaction().commit();
- } catch (HibernateException e) {
- logger.error("commitDBSession() - error while committing transaction: " + e.getMessage());
- if ( s != null ) {
- // The docs say to do so
- try {
- s.getTransaction().rollback();
- } catch (HibernateException e1) {
- try {
- s.close();
- } catch (HibernateException e2) {
- }
- }
- }
- return false;
- }
- return true;
- }
-
- public boolean rollbackDBSession() {
- if ( !checkSession() )
- return false;
-
- Session s = null;
- try {
- s = sessionFactory.getCurrentSession();
- s.getTransaction().rollback();
- } catch (HibernateException e) {
- logger.error("commitDBSession() - error while rolling back transaction: " + e.getMessage());
- if ( s != null ) {
- try {
- s.close();
- } catch (HibernateException e1) {
- }
- }
- return false;
- }
- return true;
- }
-
- public boolean flushDBSession() {
- if ( !checkSession() )
- return false;
-
- Session s = null;
- try {
- s = sessionFactory.getCurrentSession();
- s.flush();
- s.clear();
- } catch (HibernateException e) {
- logger.error("flushDBSession() - error while flushing session: " + e.getMessage());
- if ( s != null ) {
- try {
- s.close();
- } catch (HibernateException e1) {
- }
- }
- return false;
- }
- return true;
- }
-
- public boolean isDBSessionActive() {
- //Boot time check
- if(isInitialised.get() == false) {
- return false;
- }
-
- Session s = null;
- try {
- s = sessionFactory.getCurrentSession();
- return s.getTransaction() != null && s.getTransaction().isActive();
- } catch (HibernateException e) {
- logger.error("isDBSessionActive() - error while checking session status: " + e.getMessage());
- if ( s != null ) {
- try {
- s.close();
- } catch (HibernateException e1) {
- }
- }
- return false;
- }
- }
-
- @SuppressWarnings("unchecked")
- public T attachObjectToDBSession(T obj) {
- if( !checkSession() )
- return null;
-
- try {
- Session s = sessionFactory.getCurrentSession();
- if ( s.contains(obj)) {
- return obj;
- } else {
- return (T) s.merge(obj);
- }
- } catch (HibernateException e) {
- logExceptionAndTerminateSession(e);
- return null;
- }
- }
-
- public int executeUpdate(String hql, Map params)
- throws QueryException {
- if (!checkSession()) {
- return -1;
- }
-
- try {
- Session s = sessionFactory.getCurrentSession();
- Query query = s.createQuery(hql);
- if (params != null) {
- for (String param : params.keySet()) {
- query.setParameter(param, params.get(param));
- }
- }
-
- return query.executeUpdate();
-
- } catch (QueryException e) {
- logExceptionAndTerminateSession(e);
- throw e;
- } catch (HibernateException e) {
- logExceptionAndTerminateSession(e);
- return -1;
- } catch (ClassCastException e) {
- // Throw a QueryException instead of forwarding the ClassCastException
- // it's more explicit
- QueryException ebis = new QueryException(
- "Invalid HQL query parameter type: " + e.getMessage(), e);
- logExceptionAndTerminateSession(ebis);
- throw ebis;
- }
- }
+ }
@Override
public boolean startUp() {
@@ -810,6 +308,72 @@ public void setInitParams(BundleContext bc, Logger l) {
this.bc = bc;
this.logger = l;
}
+
+ @Override
+ public DBSessionManager getSessionManager() {
+ return sessionManager;
+ }
+
+ @Override
+ public QueryInterface getQueryInterface() {
+ return getQueryInterface(QueryInterface.class);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T getQueryInterface(Class queryInterfaceType) {
+ if (!queryInterfaces.containsKey(queryInterfaceType)) {
+ if (!queryInterfaceFactories.containsKey(queryInterfaceType)) {
+ logger.error("Requesting QueryInterface of unknown type: " + queryInterfaceType.getName());
+ return null;
+ }
+
+ try {
+ // Lazy initialization of QueryInterfaces by using a factory pattern
+ QueryInterfaceFactory factory = (QueryInterfaceFactory)
+ queryInterfaceFactories.get(queryInterfaceType).newInstance();
+ T qi = factory.build(this, sessionFactory, sessionValidation);
+
+ queryInterfaces.put(queryInterfaceType, qi);
+ } catch (InstantiationException | IllegalAccessException e) {
+ logger.error("Failed to instantiate QueryInterface: ", e);
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ return (T) queryInterfaces.get(queryInterfaceType);
+ }
+
+ @Override
+ public void registerQueryInterface(Class queryInterfaceType,
+ Class extends QueryInterfaceFactory extends T>> factoryType) {
+ // Override any existing interface
+ if (queryInterfaces.containsKey(queryInterfaceType))
+ queryInterfaces.remove(queryInterfaceType);
+
+ queryInterfaceFactories.put(queryInterfaceType, factoryType);
+ }
+
+ /**
+ * Prepare the DB service for testing by injecting a custom SessionFactory.
+ * Note: this should NOT be used in production code.
+ *
+ * @param s a custom SessionFactory object
+ * @param setInitialised true if the DBServiceImpl should be considered initialised
+ * @param l the logger to use for the DB service
+ */
+ public void prepareForTest(SessionFactory s, boolean setInitialised, Logger l) {
+ this.sessionFactory = s;
+ this.logger = l;
+
+ DBSessionManagerImpl ssm = new DBSessionManagerImpl(sessionFactory, logger, isInitialised);
+ this.sessionManager = ssm;
+ this.sessionValidation = ssm;
+ preloadFactories();
+
+ isInitialised.set(setInitialised);
+ }
}
//vi: ai nosi sw=4 ts=4 expandtab
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/db/DBSessionManagerImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/DBSessionManagerImpl.java
new file mode 100644
index 000000000..02320db46
--- /dev/null
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/DBSessionManagerImpl.java
@@ -0,0 +1,226 @@
+package eu.sqooss.impl.service.db;
+
+import java.sql.SQLException;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.hibernate.HibernateException;
+import org.hibernate.JDBCException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+import eu.sqooss.service.db.DAObject;
+import eu.sqooss.service.db.DBSessionManager;
+import eu.sqooss.service.db.DBSessionValidation;
+import eu.sqooss.service.logging.Logger;
+
+/**
+ * Default implementation of the DBSessionManager and DBSessionValidation interfaces
+ * based on the Hibernate framework.
+ */
+public class DBSessionManagerImpl implements DBSessionManager, DBSessionValidation {
+
+ private AtomicBoolean isInitialised = null;
+ private Logger logger = null;
+ private SessionFactory sessionFactory = null;
+
+ public DBSessionManagerImpl(SessionFactory factory, Logger logger, AtomicBoolean isInit) {
+ this.sessionFactory = factory;
+ this.logger = logger;
+ this.isInitialised = isInit;
+ }
+
+ @Override
+ public boolean startDBSession() {
+ // Boot time check
+ if (isInitialised.get() == false) {
+ return false;
+ }
+
+ if (isDBSessionActive()) {
+ logger.debug("startDBSession() - a session was already started for that thread");
+ return true;
+ }
+
+ Session s = null;
+ try {
+ s = sessionFactory.getCurrentSession();
+ // logger.debug("startDBSession: " + s + "[hashcode=" + s.hashCode()
+ // + ",open=" + s.isOpen() + "]");
+ s.beginTransaction();
+ } catch (HibernateException e) {
+ logger.error("startDBSession() - error while initializing session: "
+ + e.getMessage());
+ if (s != null) {
+ try {
+ s.close();
+ } catch (HibernateException e1) {
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean commitDBSession() {
+ if ( !checkSession() )
+ return false;
+
+ Session s = null;
+ try {
+ s = sessionFactory.getCurrentSession();
+ //logger.debug("commitDBSession: " + s + "[hashcode=" + s.hashCode() + ",open=" + s.isOpen() + "]");
+ s.getTransaction().commit();
+ } catch (HibernateException e) {
+ logger.error("commitDBSession() - error while committing transaction: " + e.getMessage());
+ if ( s != null ) {
+ // The docs say to do so
+ try {
+ s.getTransaction().rollback();
+ } catch (HibernateException e1) {
+ try {
+ s.close();
+ } catch (HibernateException e2) {
+ }
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean rollbackDBSession() {
+ if ( !checkSession() )
+ return false;
+
+ Session s = null;
+ try {
+ s = sessionFactory.getCurrentSession();
+ s.getTransaction().rollback();
+ } catch (HibernateException e) {
+ logger.error("commitDBSession() - error while rolling back transaction: " + e.getMessage());
+ if ( s != null ) {
+ try {
+ s.close();
+ } catch (HibernateException e1) {
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean flushDBSession() {
+ if ( !checkSession() )
+ return false;
+
+ Session s = null;
+ try {
+ s = sessionFactory.getCurrentSession();
+ s.flush();
+ s.clear();
+ } catch (HibernateException e) {
+ logger.error("flushDBSession() - error while flushing session: " + e.getMessage());
+ if ( s != null ) {
+ try {
+ s.close();
+ } catch (HibernateException e1) {
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isDBSessionActive() {
+ //Boot time check
+ if(isInitialised.get() == false) {
+ return false;
+ }
+
+ Session s = null;
+ try {
+ s = sessionFactory.getCurrentSession();
+ return s.getTransaction() != null && s.getTransaction().isActive();
+ } catch (HibernateException e) {
+ logger.error("isDBSessionActive() - error while checking session status: " + e.getMessage());
+ if ( s != null ) {
+ try {
+ s.close();
+ } catch (HibernateException e1) {
+ }
+ }
+ return false;
+ }
+ }
+
+ @Override
+ public T attachObjectToDBSession(T obj) {
+ if( !checkSession() )
+ return null;
+
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ if ( s.contains(obj)) {
+ return obj;
+ } else {
+ return (T) s.merge(obj);
+ }
+ } catch (HibernateException e) {
+ logExceptionAndTerminateSession(e);
+ return null;
+ }
+ }
+
+ @Override
+ public boolean checkSession() {
+ if ( !isDBSessionActive() ) {
+ logger.warn("Trying to call a DBService method without an active session");
+ try {
+ throw new Exception("No active session.");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void logExceptionAndTerminateSession( Exception e ) {
+ if ( e instanceof JDBCException ) {
+ JDBCException jdbce = (JDBCException) e;
+ logSQLException(jdbce.getSQLException());
+ }
+ logger.warn("Exception caught during database session: " + e.getMessage()
+ + ". Rolling back current transaction and terminating session...");
+ e.printStackTrace();
+ Session s = null;
+ try {
+ s = sessionFactory.getCurrentSession();
+ s.getTransaction().rollback();
+ } catch (HibernateException e1) {
+ logger.error("Error while rolling back failed transaction :" + e1.getMessage());
+ if ( s != null ) {
+ try {
+ s.close();
+ } catch ( HibernateException e2) {}
+ }
+ }
+
+ }
+
+ @Override
+ public void logSQLException(SQLException e) {
+
+ while (e != null) {
+ String message = String.format("SQLException: SQL State:%s, Error Code:%d, Message:%s",
+ e.getSQLState(), e.getErrorCode(), e.getMessage());
+ logger.warn(message);
+ e = e.getNextException();
+ }
+ }
+}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/db/HQLQueryInterfaceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/HQLQueryInterfaceImpl.java
new file mode 100644
index 000000000..db997d9f2
--- /dev/null
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/HQLQueryInterfaceImpl.java
@@ -0,0 +1,273 @@
+package eu.sqooss.impl.service.db;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
+import org.hibernate.Query;
+import org.hibernate.QueryException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+import eu.sqooss.service.db.DAObject;
+import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.DBSessionManager;
+import eu.sqooss.service.db.DBSessionValidation;
+import eu.sqooss.service.db.HQLQueryInterface;
+import eu.sqooss.service.db.QueryInterfaceFactory;
+import eu.sqooss.service.logging.Logger;
+
+/**
+ * Default implementation of the doHQL functions and standard query functions.
+ */
+public class HQLQueryInterfaceImpl implements HQLQueryInterface {
+
+ private SessionFactory sessionFactory;
+ private DBSessionManager sessionManager;
+ private DBSessionValidation sessionValidation;
+ private Logger logger;
+
+ public HQLQueryInterfaceImpl(DBSessionManager sessionManager, DBSessionValidation sessionValidation,
+ SessionFactory sessionFactory, Logger logger) {
+ this.sessionManager = sessionManager;
+ this.sessionValidation = sessionValidation;
+ this.sessionFactory = sessionFactory;
+ this.logger = logger;
+ }
+
+ public T findObjectById(Class daoClass, long id) {
+ return doFindObjectById(daoClass, id, false);
+ }
+
+ public T findObjectByIdForUpdate(Class daoClass, long id) {
+ return doFindObjectById(daoClass, id, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ private T doFindObjectById(Class daoClass, long id, boolean useLock) {
+ if ( !sessionValidation.checkSession() )
+ return null;
+
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ return (T) (useLock ? s.get(daoClass, id, LockMode.UPGRADE) : s.get(daoClass, id));
+ } catch (HibernateException e) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ return null;
+ }
+ }
+
+ public List findObjectsByProperties(Class daoClass, Map properties) {
+ return doFindObjectsByProperties(daoClass, properties, false);
+ }
+
+ public List findObjectsByPropertiesForUpdate(Class daoClass, Map properties) {
+ return doFindObjectsByProperties(daoClass, properties, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ private List doFindObjectsByProperties(Class daoClass, Map properties, boolean useLock) {
+ if( !sessionValidation.checkSession() )
+ return Collections.emptyList();
+
+ // TODO maybe check that the properties are valid (e.g. with java.bean.PropertyDescriptor)
+
+ Map parameterMap = new HashMap();
+ StringBuffer whereClause = new StringBuffer();
+ for (String key : properties.keySet()) {
+ whereClause.append( whereClause.length() == 0 ? " where " : " and " );
+ // We use "foo" as the name of the object
+ whereClause.append("foo" + "." + key + "=:_" + key );
+ parameterMap.put( "_" + key, properties.get(key) );
+ }
+ try {
+ // We use "foo" as the name of the object
+ return (List) doHQL( "from " + daoClass.getName() + " as foo " + whereClause, parameterMap, useLock );
+ } catch (QueryException e) {
+ logger.warn("findObjectsByProperties(): invalid properties map. Restarting session...");
+ // Automatically restart a session
+ // (just be careful with preloaded DAOs that become detached)
+ sessionManager.startDBSession();
+ return Collections.emptyList();
+ }
+ }
+
+ public boolean addRecord(DAObject record) {
+ ArrayList tmpList = new ArrayList(1);
+ tmpList.add(record);
+ return addRecords(tmpList);
+ }
+
+ public boolean deleteRecord(DAObject record) {
+ ArrayList tmpList = new ArrayList(1);
+ tmpList.add(record);
+ return deleteRecords(tmpList);
+ }
+
+ public boolean addRecords(List records) {
+ if( !sessionValidation.checkSession() )
+ return false;
+
+ DAObject lastRecord = null;
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ for (DAObject record : records) {
+ lastRecord = record;
+ s.save(record);
+ }
+ lastRecord = null;
+ s.flush();
+ return true;
+ } catch (HibernateException e) {
+ if (lastRecord != null) {
+ logger.error("Failed to add object "
+ + "[" + lastRecord.getClass().getName() + ":" + lastRecord.getId() + "]"
+ + " to the database: " + e.getMessage());
+ }
+ sessionValidation.logExceptionAndTerminateSession(e);
+ return false;
+ }
+ }
+
+ public boolean deleteRecords(List records) {
+ if( !sessionValidation.checkSession() )
+ return false;
+
+ DAObject lastRecord = null;
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ for (DAObject record : records) {
+ lastRecord = record;
+ s.delete(record);
+ }
+ lastRecord = null;
+ s.flush();
+ return true;
+ } catch (HibernateException e) {
+ if (lastRecord != null) {
+ logger.error("Failed to remove object "
+ + "[" + lastRecord.getClass().getName() + ":" + lastRecord.getId() + "]"
+ + " from the database: " + e.getMessage());
+ }
+ sessionValidation.logExceptionAndTerminateSession(e);
+ return false;
+ }
+ }
+
+ public List> doHQL(String hql)
+ throws QueryException {
+ return doHQL(hql, null, null, false, -1, -1);
+ }
+
+ public List> doHQL(String hql, Map params)
+ throws QueryException {
+ return doHQL(hql, params, null, false, -1, -1);
+ }
+
+ public List> doHQL(String hql, Map params, int limit)
+ throws QueryException {
+ return doHQL(hql, params, null, false, 0, limit);
+ }
+
+ public List> doHQL(String hql, Map params, boolean lockForUpdate)
+ throws QueryException {
+ return doHQL(hql, params, null, lockForUpdate, -1, -1);
+ }
+
+ public List> doHQL(String hql, Map params,
+ Map collectionParams)
+ throws QueryException {
+ return doHQL(hql, params, collectionParams, false, -1, -1);
+ }
+
+ public List> doHQL(String hql, Map params,
+ Map collectionParams, boolean lockForUpdate, int start, int limit)
+ throws QueryException {
+ if ( !sessionValidation.checkSession() ) {
+ return Collections.emptyList();
+ }
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ Query query = s.createQuery(hql);
+ if (params != null) {
+ for ( String param : params.keySet() ) {
+ query.setParameter(param, params.get(param));
+ }
+ }
+ if (collectionParams != null) {
+ for ( String param : collectionParams.keySet() ) {
+ query.setParameterList(param, collectionParams.get(param));
+ }
+ }
+ if (lockForUpdate) {
+ query.setLockMode("foo", LockMode.PESSIMISTIC_WRITE);
+ }
+ if ( start >= 0 && limit >= 0 ) {
+ query.setFirstResult(start);
+ query.setMaxResults(limit);
+ }
+ return query.list();
+ } catch ( QueryException e ) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ throw e;
+ } catch( HibernateException e ) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ return Collections.emptyList();
+ } catch (ClassCastException e) {
+ // Throw a QueryException instead of forwarding the ClassCastException
+ // it's more explicit
+ QueryException ebis = new QueryException("Invalid HQL query parameter type: "
+ + e.getMessage(), e);
+ sessionValidation.logExceptionAndTerminateSession(ebis);
+ throw ebis;
+ }
+
+ }
+
+ public int executeUpdate(String hql, Map params) throws QueryException {
+ if (!sessionValidation.checkSession()) {
+ return -1;
+ }
+
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ Query query = s.createQuery(hql);
+ if (params != null) {
+ for (String param : params.keySet()) {
+ query.setParameter(param, params.get(param));
+ }
+ }
+
+ return query.executeUpdate();
+
+ } catch (QueryException e) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ throw e;
+ } catch (HibernateException e) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ return -1;
+ } catch (ClassCastException e) {
+ // Throw a QueryException instead of forwarding the ClassCastException
+ // it's more explicit
+ QueryException ebis = new QueryException(
+ "Invalid HQL query parameter type: " + e.getMessage(), e);
+ sessionValidation.logExceptionAndTerminateSession(ebis);
+ throw ebis;
+ }
+ }
+
+ public static class Factory implements QueryInterfaceFactory {
+
+ @Override
+ public HQLQueryInterface build(DBService dbService, SessionFactory sessionFactory,
+ DBSessionValidation sessionValidation) {
+ return new HQLQueryInterfaceImpl(dbService.getSessionManager(),
+ sessionValidation, sessionFactory, dbService.logger());
+ }
+ }
+}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/db/SQLQueryInterfaceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/SQLQueryInterfaceImpl.java
new file mode 100644
index 000000000..9ec935472
--- /dev/null
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/db/SQLQueryInterfaceImpl.java
@@ -0,0 +1,181 @@
+package eu.sqooss.impl.service.db;
+
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.HibernateException;
+import org.hibernate.JDBCException;
+import org.hibernate.Query;
+import org.hibernate.QueryException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+import eu.sqooss.service.db.DAObject;
+import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.DBSessionManager;
+import eu.sqooss.service.db.DBSessionValidation;
+import eu.sqooss.service.db.QueryInterface;
+import eu.sqooss.service.db.QueryInterfaceFactory;
+import eu.sqooss.service.db.SQLQueryInterface;
+
+/**
+ * Default implementation of the (deprecated) SQL queries. The standard queries
+ * specified by QueryInterface are not supported through SQL, so these functions
+ * are delegated to the QueryInterface instance provided by DBService.
+ */
+public class SQLQueryInterfaceImpl implements SQLQueryInterface {
+
+ private DBService dbService;
+ private QueryInterface qi;
+ private DBSessionManager sessionManager;
+ private DBSessionValidation sessionValidation;
+ private SessionFactory sessionFactory;
+
+ public SQLQueryInterfaceImpl(DBService dbService, DBSessionValidation sesVal,
+ SessionFactory sesFac) {
+ this.sessionManager = dbService.getSessionManager();
+ this.sessionValidation = sesVal;
+ this.sessionFactory = sesFac;
+ this.dbService = dbService;
+ this.qi = null;
+ }
+
+ @Override
+ @Deprecated
+ public List> doSQL(String sql) throws SQLException {
+ return doSQL(sql, null);
+ }
+
+ @Override
+ @Deprecated
+ public List> doSQL(String sql, Map params)
+ throws SQLException, QueryException {
+ boolean autoSession = !sessionManager.isDBSessionActive();
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ if (autoSession) {
+ s.beginTransaction();
+ }
+ Query query = s.createSQLQuery(sql);
+ if ( params != null ) {
+ for ( String param : params.keySet() ) {
+ query.setParameter(param, params.get(param));
+ }
+ }
+ List> result = query.list();
+ if (autoSession) {
+ s.getTransaction().commit();
+ }
+ return result;
+ } catch ( JDBCException e ) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ throw e.getSQLException();
+ } catch ( QueryException e ) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ throw e;
+ } catch( HibernateException e ) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ @Deprecated
+ public int callProcedure(String procName, List args,
+ Map params) throws SQLException, QueryException {
+ boolean autoSession = !sessionManager.isDBSessionActive();
+ StringBuilder sql = new StringBuilder("call " + procName + "(");
+
+ for (String arg : args) {
+ sql.append(":").append(arg).append(",");
+ }
+ sql.deleteCharAt(sql.lastIndexOf(",")).append(")");
+
+ try {
+ Session s = sessionFactory.getCurrentSession();
+ if (autoSession) {
+ s.beginTransaction();
+ }
+ Query query = s.createSQLQuery(sql.toString());
+ if (params != null) {
+ for (String param : params.keySet()) {
+ query.setParameter(param, params.get(param));
+ }
+ }
+ int result = query.executeUpdate();
+ if (autoSession) {
+ s.getTransaction().commit();
+ }
+ return result;
+ } catch (JDBCException e) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ throw e.getSQLException();
+ } catch (QueryException e) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ throw e;
+ } catch (HibernateException e) {
+ sessionValidation.logExceptionAndTerminateSession(e);
+ throw e;
+ }
+ }
+
+ @Override
+ public T findObjectById(Class daoClass, long id) {
+ return getQI().findObjectById(daoClass, id);
+ }
+
+ @Override
+ public T findObjectByIdForUpdate(Class daoClass,
+ long id) {
+ return getQI().findObjectByIdForUpdate(daoClass, id);
+ }
+
+ @Override
+ public List findObjectsByProperties(
+ Class daoClass, Map properties) {
+ return getQI().findObjectsByProperties(daoClass, properties);
+ }
+
+ @Override
+ public List findObjectsByPropertiesForUpdate(
+ Class daoClass, Map properties) {
+ return getQI().findObjectsByPropertiesForUpdate(daoClass, properties);
+ }
+
+ @Override
+ public boolean addRecord(DAObject record) {
+ return getQI().addRecord(record);
+ }
+
+ @Override
+ public boolean addRecords(List records) {
+ return getQI().addRecords(records);
+ }
+
+ @Override
+ public boolean deleteRecord(DAObject record) {
+ return getQI().deleteRecord(record);
+ }
+
+ @Override
+ public boolean deleteRecords(List records) {
+ return getQI().deleteRecords(records);
+ }
+
+ private QueryInterface getQI() {
+ if (qi == null)
+ qi = dbService.getQueryInterface();
+ return qi;
+ }
+
+ public static class Factory implements QueryInterfaceFactory {
+
+ @Override
+ public SQLQueryInterface build(DBService dbService, SessionFactory sessionFactory,
+ DBSessionValidation sessionValidation) {
+ return new SQLQueryInterfaceImpl(dbService, sessionValidation, sessionFactory);
+ }
+ }
+}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/FDSServiceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/FDSServiceImpl.java
index e28fb7ea3..a96af47d2 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/FDSServiceImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/FDSServiceImpl.java
@@ -393,7 +393,7 @@ private ProjectVersion cacheKeyProjectVersion(String key) {
DBService dbs = AlitheiaCore.getInstance().getDBService();
Long id = Long.parseLong(key.split("|")[1]);
- return dbs.findObjectById(ProjectVersion.class, id);
+ return dbs.getQueryInterface().findObjectById(ProjectVersion.class, id);
}
/**
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/OnDiskCheckoutImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/OnDiskCheckoutImpl.java
index 36087f5b8..b7c6f0d0a 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/OnDiskCheckoutImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/OnDiskCheckoutImpl.java
@@ -122,7 +122,7 @@ public File getRoot()
/** {@inheritDoc} */
public ProjectVersion getProjectVersion() {
DBService dbs = AlitheiaCore.getInstance().getDBService();
- revision = dbs.attachObjectToDBSession(revision);
+ revision = dbs.getSessionManager().attachObjectToDBSession(revision);
return revision;
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/TimelineImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/TimelineImpl.java
index 8707e9348..064284033 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/TimelineImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/fds/TimelineImpl.java
@@ -46,6 +46,7 @@
import eu.sqooss.core.AlitheiaCore;
import eu.sqooss.service.db.Bug;
import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.HQLQueryInterface;
import eu.sqooss.service.db.MailMessage;
import eu.sqooss.service.db.MailingList;
import eu.sqooss.service.db.ProjectVersion;
@@ -85,7 +86,7 @@ private SortedSet getScmTimeLine(Calendar from, Calendar to) {
params.put("paramFrom", begin);
params.put("paramProject", project);
- List versions = (List) dbs.doHQL(query.toString(), params);
+ List versions = (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL(query.toString(), params);
for(ProjectVersion version : versions) {
result.add( new RepositoryEvent(version.getTimestamp(), version) );
@@ -113,7 +114,7 @@ private SortedSet getMailTimeLine(Calendar from, Calendar to)
if (lists != null) {
for (MailingList list : lists) {
params.put("paramList", list);
- List messages = (List) dbs.doHQL(query.toString(), params);
+ List messages = (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL(query.toString(), params);
for (MailMessage message : messages) {
result.add(new MailingListEvent(
@@ -141,7 +142,7 @@ private SortedSet getBugTimeLine(Calendar from, Calendar to) {
params.put("paramTo", end);
params.put("paramFrom", begin);
params.put("paramProject", project);
- List bugs = (List) dbs.doHQL(query.toString(), params);
+ List bugs = (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL(query.toString(), params);
for (Bug bug : bugs) {
result.add(new BugDBEvent(bug.getCreationTS().getTime(), bug));
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorImpl.java
index 4487e5202..0df5f78c7 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorImpl.java
@@ -37,6 +37,7 @@
import java.util.concurrent.atomic.AtomicLong;
import eu.sqooss.service.abstractmetric.InvocationOrder;
+
import org.osgi.framework.BundleContext;
import eu.sqooss.core.AlitheiaCore;
@@ -51,6 +52,7 @@
import eu.sqooss.service.db.DBService;
import eu.sqooss.service.db.EncapsulationUnit;
import eu.sqooss.service.db.ExecutionUnit;
+import eu.sqooss.service.db.HQLQueryInterface;
import eu.sqooss.service.db.MailMessage;
import eu.sqooss.service.db.MailingList;
import eu.sqooss.service.db.MailingListThread;
@@ -132,7 +134,7 @@ public void syncMetrics(StoredProject sp, Class extends DAObject> actType) {
@Override
public void syncMetrics(AlitheiaPlugin ap) {
List lp =
- (List) db.doHQL("from StoredProject");
+ (List) db.getQueryInterface(HQLQueryInterface.class).doHQL("from StoredProject");
for(StoredProject sp : lp) {
syncMetric(ap, sp);
@@ -286,7 +288,7 @@ public long priority() {
@Override
protected void run() throws Exception {
DBService dbs = AlitheiaCore.getInstance().getDBService();
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
sp = DAObject.loadDAObyId(sp.getId(), StoredProject.class);
PluginInfo mi = pa.getPluginInfo(m);
Set> actTypes = mi.getActivationTypes();
@@ -364,7 +366,7 @@ protected void run() throws Exception {
}
}
sched.enqueueNoDependencies(jobs);
- dbs.commitDBSession();
+ dbs.getSessionManager().commitDBSession();
}
@Override
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorJob.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorJob.java
index 8a8c923b4..592af556e 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorJob.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/metricactivator/MetricActivatorJob.java
@@ -83,9 +83,9 @@ public long priority() {
@Override
protected void run() throws Exception {
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
metric.setJob(this);
- DAObject obj = dbs.findObjectById(daoType, daoID);
+ DAObject obj = dbs.getQueryInterface().findObjectById(daoType, daoID);
try {
if (fastSync) {
@@ -108,13 +108,13 @@ protected void run() throws Exception {
} catch (AlreadyProcessingException ape) {
logger.warn("DAO id " + daoID + " is locked, job has been " +
"rescheduled");
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
return;
} catch (LockAcquisitionException lae) {
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
}
- if (!dbs.commitDBSession()) {
+ if (!dbs.getSessionManager().commitDBSession()) {
logger.warn("commit failed - restarting metric job");
restart();
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/pa/PAServiceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/pa/PAServiceImpl.java
index 436496aba..379316c3c 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/pa/PAServiceImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/pa/PAServiceImpl.java
@@ -397,7 +397,7 @@ public void serviceChanged(ServiceEvent event) {
// Get a reference to the affected service
ServiceReference affectedService = event.getServiceReference();
- sobjDB.startDBSession();
+ sobjDB.getSessionManager().startDBSession();
// Find out what happened to the service
switch (event.getType()) {
@@ -415,7 +415,7 @@ public void serviceChanged(ServiceEvent event) {
}
// Close the DB session
- sobjDB.commitDBSession();
+ sobjDB.getSessionManager().commitDBSession();
}
/* ===[ Implementation of the PluginAdmin interface ]===================== */
@@ -646,7 +646,7 @@ protected void run() throws Exception {
try {
DBService dbs = AlitheiaCore.getInstance().getDBService();
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
// Get the metric plug-in's service
ServiceReference srefPlugin = getPluginService(serviceID);
@@ -674,7 +674,7 @@ protected void run() throws Exception {
pluginInfo.getHashcode(), pluginInfo);
}
}
- dbs.commitDBSession();
+ dbs.getSessionManager().commitDBSession();
} catch (Exception e) {
logger.warn(UNINSTALL_FAILED, e);
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/rest/ResteasyServlet.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/rest/ResteasyServlet.java
index cbb414ca1..114dcc0ae 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/rest/ResteasyServlet.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/rest/ResteasyServlet.java
@@ -51,12 +51,12 @@ protected void service(HttpServletRequest httpServletRequest,
DBService db = AlitheiaCore.getInstance().getDBService();
- if (!db.isDBSessionActive())
- db.startDBSession();
+ if (!db.getSessionManager().isDBSessionActive())
+ db.getSessionManager().startDBSession();
super.service(httpServletRequest, httpServletResponse);
- if (db.isDBSessionActive())
- db.commitDBSession();
+ if (db.getSessionManager().isDBSessionActive())
+ db.getSessionManager().commitDBSession();
}
}
\ No newline at end of file
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/tds/TDSServiceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/tds/TDSServiceImpl.java
index 9635be25d..b51ae556f 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/tds/TDSServiceImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/tds/TDSServiceImpl.java
@@ -146,13 +146,13 @@ private void stuffer() {
logger.info("TDS is now running the stuffer.");
DBService db = AlitheiaCore.getInstance().getDBService();
- if (db != null && db.startDBSession()) {
+ if (db != null && db.getSessionManager().startDBSession()) {
for (StoredProject p : ClusterNode.thisNode().getProjects()) {
addAccessor(p.getId(), p.getName(), p.getBtsUrl(),
p.getMailUrl(), p.getScmUrl());
}
- db.commitDBSession();
+ db.getSessionManager().commitDBSession();
}
logger.info("TDS Stuffer is finished.");
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/OhlohUpdater.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/OhlohUpdater.java
index 6d7016203..f02c14ba2 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/OhlohUpdater.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/OhlohUpdater.java
@@ -106,7 +106,7 @@ public boolean accept(File dir, String name) {
for (String file : files) {
- dbs.startDBSession();
+ dbs.getSessionManager().startDBSession();
SAXReader reader = new SAXReader(false);
Document document = null;
@@ -160,10 +160,10 @@ public InputSource resolveEntity(String publicId, String systemId) {
od.setUname(uname);
} else {
od = new OhlohDeveloper(uname, mailhash, id);
- dbs.addRecord(od);
+ dbs.getQueryInterface().addRecord(od);
}
}
- dbs.commitDBSession();
+ dbs.getSessionManager().commitDBSession();
}
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/UpdaterServiceImpl.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/UpdaterServiceImpl.java
index 75148b1fe..c63b34732 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/UpdaterServiceImpl.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/updater/UpdaterServiceImpl.java
@@ -571,8 +571,8 @@ public synchronized void jobStateChanged(Job j, State newState) {
return;
}
- if (!dbs.isDBSessionActive())
- dbs.startDBSession();
+ if (!dbs.getSessionManager().isDBSessionActive())
+ dbs.getSessionManager().startDBSession();
StoredProject sp = StoredProject.loadDAObyId(projectId, StoredProject.class);
removeUpdater(sp, ut);
@@ -580,7 +580,7 @@ public synchronized void jobStateChanged(Job j, State newState) {
logger.warn(ut + " updater job for project " + sp
+ " did not finish properly");
}
- dbs.commitDBSession();
+ dbs.getSessionManager().commitDBSession();
}
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/AdminServlet.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/AdminServlet.java
index bde9ad0e3..ea1b42fba 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/AdminServlet.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/AdminServlet.java
@@ -157,8 +157,8 @@ private void addStaticContent(String path, String type) {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
- if (!db.isDBSessionActive()) {
- db.startDBSession();
+ if (!db.getSessionManager().isDBSessionActive()) {
+ db.getSessionManager().startDBSession();
}
try {
@@ -199,8 +199,8 @@ else if ((query != null) && (dynamicContentMap.containsKey(query))) {
logger.warn("Got a NPE while rendering a page.",e);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} finally {
- if (db.isDBSessionActive()) {
- db.commitDBSession();
+ if (db.getSessionManager().isDBSessionActive()) {
+ db.getSessionManager().commitDBSession();
}
}
}
@@ -208,8 +208,8 @@ else if ((query != null) && (dynamicContentMap.containsKey(query))) {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
- if (!db.isDBSessionActive()) {
- db.startDBSession();
+ if (!db.getSessionManager().isDBSessionActive()) {
+ db.getSessionManager().startDBSession();
}
try {
@@ -236,8 +236,8 @@ protected void doPost(HttpServletRequest request,
logger.warn("Got a NPE while handling POST data.");
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} finally {
- if (db.isDBSessionActive()) {
- db.commitDBSession();
+ if (db.getSessionManager().isDBSessionActive()) {
+ db.getSessionManager().commitDBSession();
}
}
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectDeleteJob.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectDeleteJob.java
index dcdda445d..31491f7ee 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectDeleteJob.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectDeleteJob.java
@@ -39,6 +39,7 @@
import eu.sqooss.core.AlitheiaCore;
import eu.sqooss.service.abstractmetric.AlitheiaPlugin;
import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.HQLQueryInterface;
import eu.sqooss.service.db.Plugin;
import eu.sqooss.service.db.ProjectVersion;
import eu.sqooss.service.db.StoredProject;
@@ -65,17 +66,17 @@ public long priority() {
protected void run() throws Exception {
DBService dbs = core.getDBService();
- if (!dbs.isDBSessionActive()) {
- dbs.startDBSession();
+ if (!dbs.getSessionManager().isDBSessionActive()) {
+ dbs.getSessionManager().startDBSession();
}
- sp = dbs.attachObjectToDBSession(sp);
+ sp = dbs.getSessionManager().attachObjectToDBSession(sp);
// Delete any associated invocation rules first
HashMap properties = new HashMap();
properties.put("project", sp);
//Cleanup plugin results
- List ps = (List) dbs.doHQL("from Plugin");
+ List ps = (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL("from Plugin");
for (Plugin p : ps ) {
AlitheiaPlugin ap = core.getPluginAdmin().getPlugin(core.getPluginAdmin().getPluginInfo(p.getHashcode()));
@@ -104,16 +105,16 @@ protected void run() throws Exception {
//Delete the project's config options
List confParams = StoredProjectConfig.fromProject(sp);
if (!confParams.isEmpty()) {
- success &= dbs.deleteRecords(confParams);
+ success &= dbs.getQueryInterface().deleteRecords(confParams);
}
// Delete the selected project
- success &= dbs.deleteRecord(sp);
+ success &= dbs.getQueryInterface().deleteRecord(sp);
if (success) {
- dbs.commitDBSession();
+ dbs.getSessionManager().commitDBSession();
} else {
- dbs.rollbackDBSession();
+ dbs.getSessionManager().rollbackDBSession();
}
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectsView.java b/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectsView.java
index 2975b36d6..957122eea 100644
--- a/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectsView.java
+++ b/alitheia/core/src/main/java/eu/sqooss/impl/service/webadmin/ProjectsView.java
@@ -135,7 +135,7 @@ public static String render(HttpServletRequest req) {
// Retrieve the selected project's DAO (if any)
reqValProjectId = fromString(req.getParameter(REQ_PAR_PROJECT_ID));
if (reqValProjectId != null) {
- selProject = sobjDB.findObjectById(
+ selProject = sobjDB.getQueryInterface().findObjectById(
StoredProject.class, reqValProjectId);
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/rest/api/MetricsResource.java b/alitheia/core/src/main/java/eu/sqooss/rest/api/MetricsResource.java
index a3416b5c7..85e1e5d81 100644
--- a/alitheia/core/src/main/java/eu/sqooss/rest/api/MetricsResource.java
+++ b/alitheia/core/src/main/java/eu/sqooss/rest/api/MetricsResource.java
@@ -45,6 +45,7 @@
import eu.sqooss.service.abstractmetric.Result;
import eu.sqooss.service.db.DAObject;
import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.HQLQueryInterface;
import eu.sqooss.service.db.Metric;
import eu.sqooss.service.db.MetricType;
import eu.sqooss.service.db.MetricType.Type;
@@ -64,7 +65,7 @@ public MetricsResource() {}
public List getMetrics() {
DBService db = AlitheiaCore.getInstance().getDBService();
String q = " from Metric";
- List sp = (List) db.doHQL(q);
+ List sp = (List) db.getQueryInterface(HQLQueryInterface.class).doHQL(q);
return sp;
}
@@ -74,7 +75,7 @@ public List getMetrics() {
public List getMetricTypes() {
DBService db = AlitheiaCore.getInstance().getDBService();
String q = " from MetricType";
- List sp = (List) db.doHQL(q);
+ List sp = (List) db.getQueryInterface(HQLQueryInterface.class).doHQL(q);
return sp;
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/rest/api/StoredProjectResource.java b/alitheia/core/src/main/java/eu/sqooss/rest/api/StoredProjectResource.java
index 6c5cf004b..4fcb5fc5f 100644
--- a/alitheia/core/src/main/java/eu/sqooss/rest/api/StoredProjectResource.java
+++ b/alitheia/core/src/main/java/eu/sqooss/rest/api/StoredProjectResource.java
@@ -48,6 +48,7 @@
import eu.sqooss.service.db.DAObject;
import eu.sqooss.service.db.DBService;
import eu.sqooss.service.db.Directory;
+import eu.sqooss.service.db.HQLQueryInterface;
import eu.sqooss.service.db.Metric;
import eu.sqooss.service.db.ProjectFile;
import eu.sqooss.service.db.ProjectVersion;
@@ -64,7 +65,7 @@ public StoredProjectResource() {}
public List getProjects() {
DBService db = AlitheiaCore.getInstance().getDBService();
String q = " from StoredProject";
- List sp = (List) db.doHQL(q);
+ List sp = (List) db.getQueryInterface(HQLQueryInterface.class).doHQL(q);
return sp;
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/abstractmetric/AbstractMetric.java b/alitheia/core/src/main/java/eu/sqooss/service/abstractmetric/AbstractMetric.java
index 73df1f9fb..aa7473d4f 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/abstractmetric/AbstractMetric.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/abstractmetric/AbstractMetric.java
@@ -60,6 +60,7 @@
import eu.sqooss.service.db.DBService;
import eu.sqooss.service.db.EncapsulationUnitMeasurement;
import eu.sqooss.service.db.ExecutionUnitMeasurement;
+import eu.sqooss.service.db.HQLQueryInterface;
import eu.sqooss.service.db.MailMessageMeasurement;
import eu.sqooss.service.db.MailingListThreadMeasurement;
import eu.sqooss.service.db.Metric;
@@ -70,6 +71,7 @@
import eu.sqooss.service.db.PluginConfiguration;
import eu.sqooss.service.db.ProjectFileMeasurement;
import eu.sqooss.service.db.ProjectVersionMeasurement;
+import eu.sqooss.service.db.QueryInterface;
import eu.sqooss.service.db.StoredProject;
import eu.sqooss.service.db.StoredProjectMeasurement;
import eu.sqooss.service.db.MetricType.Type;
@@ -98,6 +100,7 @@ public abstract class AbstractMetric implements AlitheiaPlugin {
/** Reference to the DB service, not to be passed to metric jobs */
protected DBService db;
+ protected QueryInterface qi;
/**
* Reference to the plugin administrator service, not to be passed to
@@ -231,6 +234,8 @@ protected AbstractMetric(BundleContext bc) {
if(db == null)
log.error("Could not get a reference to the DB service");
+ else
+ qi = db.getQueryInterface();
pa = AlitheiaCore.getInstance().getPluginAdmin();
@@ -561,7 +566,7 @@ public List getAllSupportedMetrics() {
Map params = new HashMap();
params.put("plugin", Plugin.getPluginByHashcode(getUniqueKey()));
- return (List)db.doHQL(qry, params);
+ return (List)db.getQueryInterface(HQLQueryInterface.class).doHQL(qry, params);
}
/** {@inheritDoc} */
@@ -598,7 +603,7 @@ public boolean install() {
HashMap h = new HashMap();
h.put("name", this.getName());
- List plugins = db.findObjectsByProperties(Plugin.class, h);
+ List plugins = qi.findObjectsByProperties(Plugin.class, h);
if (!plugins.isEmpty()) {
log.warn("A plugin with name <" + getName()
@@ -614,7 +619,7 @@ public boolean install() {
p.setVersion(getVersion());
p.setActive(true);
p.setHashcode(getUniqueKey());
- boolean result = db.addRecord(p);
+ boolean result = qi.addRecord(p);
//3. Add the metrics
for (String mnem :metrics.keySet()) {
@@ -623,13 +628,13 @@ public boolean install() {
MetricType newType = MetricType.getMetricType(type);
if (newType == null) {
newType = new MetricType(type);
- db.addRecord(newType);
+ qi.addRecord(newType);
m.setMetricType(newType);
}
m.setMetricType(newType);
m.setPlugin(p);
- db.addRecord(m);
+ qi.addRecord(m);
}
return result;
@@ -642,7 +647,7 @@ public boolean install() {
*/
public boolean remove() {
Plugin p = Plugin.getPluginByHashcode(getUniqueKey());
- return db.deleteRecord(p);
+ return qi.deleteRecord(p);
}
/**
@@ -844,12 +849,12 @@ public PluginConfiguration getConfigurationOption(String config) {
*/
protected List getResult(DAObject o, Class extends MetricMeasurement> clazz,
Metric m, Result.ResultType type) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ //DBService dbs = AlitheiaCore.getInstance().getDBService();
Map props = new HashMap();
props.put(resultFieldNames.get(clazz), o);
props.put("metric", m);
- List resultat = dbs.findObjectsByProperties(clazz, props);
+ List resultat = qi.findObjectsByProperties(clazz, props);
if (resultat.isEmpty())
return Collections.EMPTY_LIST;
@@ -929,7 +934,7 @@ public Map> getObjectIdsToSync(StoredProject sp
throw new MetricActivationException("Metric synchronisation with GENERIC objects not implemented");
}
- List objectIds = (List) db.doHQL(q, params);
+ List objectIds = (List) db.getQueryInterface(HQLQueryInterface.class).doHQL(q, params);
TreeSet ids = new TreeSet();
ids.addAll(objectIds);
IDs.put(MetricType.fromActivator(at), ids);
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/admin/actions/AddProject.java b/alitheia/core/src/main/java/eu/sqooss/service/admin/actions/AddProject.java
index 16dbe459b..76ba4f631 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/admin/actions/AddProject.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/admin/actions/AddProject.java
@@ -12,6 +12,7 @@
import eu.sqooss.service.db.ConfigOption;
import eu.sqooss.service.db.ConfigurationOption;
import eu.sqooss.service.db.DBService;
+import eu.sqooss.service.db.QueryInterface;
import eu.sqooss.service.db.StoredProject;
import eu.sqooss.service.tds.BTSAccessor;
import eu.sqooss.service.tds.InvalidAccessorException;
@@ -79,7 +80,7 @@ public String descr() {
public void execute() throws Exception {
super.execute();
String name = null, bts = null, scm = null, mail = null, contact = null, web = null;
- DBService db = AlitheiaCore.getInstance().getDBService();
+ QueryInterface qi = AlitheiaCore.getInstance().getDBService().getQueryInterface();
TDSService tds = AlitheiaCore.getInstance().getTDSService();
if (args.containsKey("dir")) {
@@ -122,7 +123,7 @@ public void execute() throws Exception {
// 1. Duplicate project
HashMap props = new HashMap();
props.put("name", name);
- if (!db.findObjectsByProperties(StoredProject.class, props).isEmpty()) {
+ if (!qi.findObjectsByProperties(StoredProject.class, props).isEmpty()) {
error("project.exists", "A project with the same name already exists");
}
@@ -179,7 +180,7 @@ public void execute() throws Exception {
StoredProject sp = new StoredProject(name);
//The project is now ready to be added
- db.addRecord(sp);
+ qi.addRecord(sp);
//Store all known properties to the database
for (ConfigOption co : ConfigOption.values()) {
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/Branch.java b/alitheia/core/src/main/java/eu/sqooss/service/db/Branch.java
index a58576cd3..4169eb5b1 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/Branch.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/Branch.java
@@ -147,20 +147,20 @@ public void setBranchOutgoing(Set branchOutgoing) {
}
public static Branch fromName(StoredProject sp, String name, boolean create) {
- DBService db = AlitheiaCore.getInstance().getDBService();
+ HQLQueryInterface hqi = AlitheiaCore.getInstance().getDBService().getQueryInterface(HQLQueryInterface.class);
Map params = new HashMap();
params.put("name", name);
params.put("project", sp);
- List branches = (List)db.doHQL(qBranchByName, params);
+ List branches = (List)hqi.doHQL(qBranchByName, params);
if (branches.isEmpty()) {
if (!create)
return null;
Branch b = new Branch();
b.setProject(sp);
b.setName(name);
- db.addRecord(b);
+ hqi.addRecord(b);
return fromName(sp, name, false);
}
@@ -168,12 +168,12 @@ public static Branch fromName(StoredProject sp, String name, boolean create) {
}
public static String suggestName(StoredProject sp) {
- DBService db = AlitheiaCore.getInstance().getDBService();
+ HQLQueryInterface hqi = AlitheiaCore.getInstance().getDBService().getQueryInterface(HQLQueryInterface.class);
Map params = new HashMap();
params.put("project", sp);
- List ids = (List) db.doHQL(qNextSequence, params);
+ List ids = (List) hqi.doHQL(qNextSequence, params);
if (ids.isEmpty())
return "1";
else
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/Bug.java b/alitheia/core/src/main/java/eu/sqooss/service/db/Bug.java
index 78b67dad8..722d34bef 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/Bug.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/Bug.java
@@ -253,7 +253,7 @@ public static Bug getLastUpdate(StoredProject sp) {
Map params = new HashMap();
params.put(paramStoredProject, sp);
- List buglist = (List) dbs.doHQL(query, params,1);
+ List buglist = (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL(query, params,1);
if (buglist.isEmpty())
return null;
@@ -283,7 +283,7 @@ public List getAllReportComments() {
params.put(paramBugID, bugID);
params.put(paramStoredProject, project);
- return (List) dbs.doHQL(query, params);
+ return (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL(query, params);
}
/**
@@ -305,7 +305,7 @@ public static Bug getBug(String bugID, StoredProject sp) {
params.put(paramBugID, bugID);
params.put(paramStoredProject, sp);
- List bug = (List) dbs.doHQL(query, params, 1);
+ List bug = (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL(query, params, 1);
if (bug.isEmpty())
return null;
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/BugPriority.java b/alitheia/core/src/main/java/eu/sqooss/service/db/BugPriority.java
index 1dc1419c2..35bd9b0a2 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/BugPriority.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/BugPriority.java
@@ -160,12 +160,12 @@ public static BugPriority getBugPriority(Priority s) {
* while modifying the DB.
*/
public static BugPriority getBugPriority(String priority, boolean create) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ QueryInterface qi = AlitheiaCore.getInstance().getDBService().getQueryInterface();
Map params = new HashMap();
params.put("priority", priority);
- List st = dbs.findObjectsByProperties(BugPriority.class,
+ List st = qi.findObjectsByProperties(BugPriority.class,
params);
if (!st.isEmpty()) {
@@ -183,7 +183,7 @@ public static BugPriority getBugPriority(String priority, boolean create) {
BugPriority bs = new BugPriority();
bs.setpriority(priority);
- if (!dbs.addRecord(bs))
+ if (!qi.addRecord(bs))
return null;
return bs;
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/BugResolution.java b/alitheia/core/src/main/java/eu/sqooss/service/db/BugResolution.java
index 1907e44a9..5b44b2d20 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/BugResolution.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/BugResolution.java
@@ -163,12 +163,12 @@ public static BugResolution getBugResolution(BugResolution.Resolution s) {
* while modifying the DB.
*/
public static BugResolution getBugResolution(String resolution, boolean create) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ QueryInterface qi = AlitheiaCore.getInstance().getDBService().getQueryInterface();
Map params = new HashMap();
params.put("resolution", resolution);
- List st = dbs.findObjectsByProperties(BugResolution.class,
+ List st = qi.findObjectsByProperties(BugResolution.class,
params);
if (!st.isEmpty()) {
@@ -186,7 +186,7 @@ public static BugResolution getBugResolution(String resolution, boolean create)
BugResolution bs = new BugResolution();
bs.setResolution(resolution);
- if (!dbs.addRecord(bs))
+ if (!qi.addRecord(bs))
return null;
return bs;
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/BugSeverity.java b/alitheia/core/src/main/java/eu/sqooss/service/db/BugSeverity.java
index e00652662..121ec6861 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/BugSeverity.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/BugSeverity.java
@@ -170,12 +170,12 @@ public static BugSeverity getBugseverity(Severity s) {
* while modifying the DB.
*/
public static BugSeverity getBugSeverity(String severity, boolean create) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ QueryInterface qi = AlitheiaCore.getInstance().getDBService().getQueryInterface();
Map params = new HashMap();
params.put("severity", severity);
- List st = dbs.findObjectsByProperties(BugSeverity.class,
+ List st = qi.findObjectsByProperties(BugSeverity.class,
params);
if (!st.isEmpty()) {
@@ -193,7 +193,7 @@ public static BugSeverity getBugSeverity(String severity, boolean create) {
BugSeverity bs = new BugSeverity();
bs.setSeverity(severity);
- if (!dbs.addRecord(bs))
+ if (!qi.addRecord(bs))
return null;
return bs;
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/BugStatus.java b/alitheia/core/src/main/java/eu/sqooss/service/db/BugStatus.java
index 6a3e27ff7..990f09898 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/BugStatus.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/BugStatus.java
@@ -168,12 +168,12 @@ public static BugStatus getBugStatus(BugStatus.Status s) {
* while modifying the DB.
*/
public static BugStatus getBugStatus(String status, boolean create) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ QueryInterface qi = AlitheiaCore.getInstance().getDBService().getQueryInterface();
Map params = new HashMap();
params.put("status", status);
- List st = dbs.findObjectsByProperties(BugStatus.class,
+ List st = qi.findObjectsByProperties(BugStatus.class,
params);
if (!st.isEmpty()) {
@@ -191,7 +191,7 @@ public static BugStatus getBugStatus(String status, boolean create) {
BugStatus bs = new BugStatus();
bs.setStatus(status);
- if (!dbs.addRecord(bs))
+ if (!qi.addRecord(bs))
return null;
return bs;
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/ClusterNode.java b/alitheia/core/src/main/java/eu/sqooss/service/db/ClusterNode.java
index 1439add8e..6b277984c 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/ClusterNode.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/ClusterNode.java
@@ -109,11 +109,11 @@ public void setProjects(Set projects) {
}
public static ClusterNode getClusteNodeByName(String name) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ QueryInterface qi = AlitheiaCore.getInstance().getDBService().getQueryInterface();
Map parameterMap = new HashMap();
parameterMap.put("name",name);
- List cnList = dbs.findObjectsByProperties(ClusterNode.class, parameterMap);
+ List cnList = qi.findObjectsByProperties(ClusterNode.class, parameterMap);
return (cnList == null || cnList.isEmpty()) ? null : cnList.get(0);
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/ConfigurationOption.java b/alitheia/core/src/main/java/eu/sqooss/service/db/ConfigurationOption.java
index 5ef0c8220..234a7e318 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/ConfigurationOption.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/ConfigurationOption.java
@@ -131,7 +131,7 @@ public void setConfigurations(Set configurations) {
*/
public void setValues(StoredProject sp, List values,
boolean overwrite) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ HQLQueryInterface hqi = AlitheiaCore.getInstance().getDBService().getQueryInterface(HQLQueryInterface.class);
String paramProject = "paramProject";
String paramConfOpt = "paramConfOpt";
@@ -149,14 +149,14 @@ public void setValues(StoredProject sp, List values,
params.put(paramConfOpt, this);
List curValues =
- (List) dbs.doHQL(query.toString(),params);
+ (List) hqi.doHQL(query.toString(),params);
boolean found = false;
if (overwrite) {
- dbs.deleteRecords(curValues);
+ hqi.deleteRecords(curValues);
for (String newValue : values) {
StoredProjectConfig newspc = new StoredProjectConfig(
this, newValue, sp);
- dbs.addRecord(newspc);
+ hqi.addRecord(newspc);
}
} else { //Merge values
for (String newValue : values) {
@@ -168,7 +168,7 @@ public void setValues(StoredProject sp, List values,
if (!found) {
StoredProjectConfig newspc = new StoredProjectConfig(
this, newValue, sp);
- dbs.addRecord(newspc);
+ hqi.addRecord(newspc);
}
}
}
@@ -197,18 +197,18 @@ public List getValues(StoredProject sp) {
params.put(paramProject, sp);
params.put(paramConfOpt, this);
- return (List) dbs.doHQL(query.toString(), params);
+ return (List) dbs.getQueryInterface(HQLQueryInterface.class).doHQL(query.toString(), params);
}
public static ConfigurationOption fromKey(String key) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
+ HQLQueryInterface hqi = AlitheiaCore.getInstance().getDBService().getQueryInterface(HQLQueryInterface.class);
String paramKey = "key";
Map params = new HashMap();
params.put(paramKey, key);
- List opts = dbs.findObjectsByProperties(ConfigurationOption.class, params);
+ List opts = hqi.findObjectsByProperties(ConfigurationOption.class, params);
if (opts.isEmpty())
return null;
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/DAObject.java b/alitheia/core/src/main/java/eu/sqooss/service/db/DAObject.java
index 752e535fb..6fc8aad66 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/DAObject.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/DAObject.java
@@ -64,8 +64,8 @@ public abstract class DAObject {
* @return
*/
public static T loadDAObyId(long id, Class type) {
- DBService dbs = AlitheiaCore.getInstance().getDBService();
- return dbs.findObjectById(type, id);
+ QueryInterface qi = AlitheiaCore.getInstance().getDBService().getQueryInterface();
+ return qi.findObjectById(type, id);
}
}
diff --git a/alitheia/core/src/main/java/eu/sqooss/service/db/DBService.java b/alitheia/core/src/main/java/eu/sqooss/service/db/DBService.java
index bb63dcd9b..5101b621f 100644
--- a/alitheia/core/src/main/java/eu/sqooss/service/db/DBService.java
+++ b/alitheia/core/src/main/java/eu/sqooss/service/db/DBService.java
@@ -34,35 +34,32 @@
package eu.sqooss.service.db;
import eu.sqooss.core.AlitheiaCoreService;
-import eu.sqooss.service.db.DAObject;
import eu.sqooss.service.logging.Logger;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.hibernate.QueryException;
-
/**
* This is the service providing access to the Alitheia Database,
* including project metadata, user management, metrics data...
*
+ * The responsibilities of the DBService are split into multiple interfaces to increase
+ * cohesion and to narrow down dependencies from other classes.
+ *
* The API includes methods for retrieving data access objects (DAO) by id or by properties,
- * and adding/deleting records in the database, and general-purpose querying methods
- * for lower-level database access.
+ * and adding/deleting records in the database, through the QueryInterface provided by the
+ * getQueryInterface() method. General-purpose querying methods for lower-level database access
+ * are available through other QueryInterfaces, most notably the HQLQueryInterface.
* Access and manipulation of the data is done directly through the DAOs in an object-oriented way.
*
* All access to the DB service has to be done in the context of a session. You can see the session
- * as the connection to the database and the transaction for that connection.
- * The method startDBSession() initialises a session, while commitDBSession() and rollbackDBSession()
+ * as the connection to the database and the transaction for that connection. Methods for database
+ * session management are provided by the DBSessionManager, obtained through the getSessionManager()
+ * method. The method startDBSession() initialises a session, while commitDBSession() and rollbackDBSession()
* end the session, by committing or cancelling the changes respectively.
* You can also query the current state of the session with the method isDBSessionActive().
*
- * All the methods in this interface are thread-safe, which means you can call these methods on the
- * same DBService object from different threads without needed to protect the access to the object.
- * Furthermore, each session is handled within the context of a thread. So if two different threads
+ * All the methods in this interface and exposed interfaces are thread-safe, which means you can call
+ * these methods on the same DBService object from different threads without needed to protect the access
+ * to the object. Furthermore, each session is handled within the context of a thread. So if two different threads
* have code that call startDBSession(), they will each start their own, and whatever they do during
* the session will be isolated from the other. (ie. no DAO sharing, no changes visible accross threads...)
*
@@ -80,412 +77,50 @@
* @author Romain Pokrzywka
*
*/
-public interface DBService extends AlitheiaCoreService {
-
- /**
- * Starts a new work session with the DBService for the current thread.
- * This method should be called before any other method from DBService, to ensure all resources
- * are properly set up and ready, such as database connection, active transaction...
- * (the only exception is doSQL, which manages the session internally)
- * Only one session per thread can be active at a time, so calling startDBSession with a
- * previously started session in the same thread has no effect and will assume usage
- * of the existing session. (e.g. if a previous session was not closed properly)
- *
- * This method is thread-safe, and it creates session for a specific thread only.
- * It will also start a database transaction, ensuring that only the current thread has access
- * to the database for the duration of the session, therefore simplifying concurrency issues.
- *
- * @return true if the session was correctly started ;
- * false if a session was already started for this thread,
- * or if the session couldn't be started
- */
- public boolean startDBSession();
-
- /**
- * Commits the changes made in the current work session into the database and closes the session,
- * also releasing the transaction lock on the database.
- *
- * This method is thread-safe, and it will always close the current session (if any)
- * and release any lock on the database, even if an error occurs.
- *
- * @return true if the commit was successful and the session correctly closed,
- * false if there was no active session or if an error occured.
- */
- public boolean commitDBSession();
-
- /**
- * Closes the current work session without committing the changes into the database,
- * also releasing the transaction lock on the database.
- *
- * Note that any DAOs loaded and modified during the session will NOT be reset to
- * their state at load-time. In other words, modifications to the DAOs are NOT cancelled,
- * however these modifications will not be persisted in the database.
- *
- * This method is thread-safe, and it will always close the current session (if any)
- * and release any lock on the database, even if an error occurs.
- *
- * @return true if the session was correctly closed,
- * false if there was no active session or if an error occured.
- */
- public boolean rollbackDBSession();
-
- /**
- * Flush the current changes in the session to the database and clears the session cache.
- * Note that the transaction isn't committed though, so changes will only be visible
- * to the current session.
- * @return true if the session was correctly flushed,
- * false if there was no active session or if an error occured.
- */
- public boolean flushDBSession();
-
- /**
- * Returns the state of the work session for the current thread.
- * @return true if a session was started and is still active,
- * false otherwise
- */
- public boolean isDBSessionActive();
+public interface DBService extends AlitheiaCoreService {
- /**
- * A generic query method to retrieve a single DAObject subclass using its identifier.
- * The return value is parameterized to the actual type of DAObject queried
- * so no downcast is needed.
- * @param daoClass the actual class of the DAObject.
- * @param id the DAObject's identifier
- * @return the DAOObject if a match for the class and the identifier was found in the database,
- * or null otherwise or if a database access error occured
- */
- public T findObjectById(Class daoClass, long id);
-
- /**
- * A generic query method to retrieve a single DAObject subclass using its identifier and
- * acquire a pessimistic row-level database lock on it.
- * This results in an SQL query with the form "SELECT ... FOR UPDATE".
- * You may use this method to ensure that no other session can modify the returned object
- * while the current session is active. This can help avoiding database-level deadlocks
- * when multiple sessions access and modify the same table in parallel.
- * The return value is parameterized to the actual type of DAObject queried
- * so no downcast is needed.
- * @param daoClass the actual class of the DAObject.
- * @param id the DAObject's identifier
- * @return the DAOObject if a match for the class and the identifier was found in the database,
- * or null otherwise or if a database access error occured
- */
- public T findObjectByIdForUpdate(Class daoClass, long id);
-
- /**
- * A generic query method to retrieve a list of DAObjects of a same subclass
- * matching a set of properties.
- * The returned list contains the objects matching all of the properties specified.
- * It is parameterized to the actual type of DAObject queried so no downcast is needed.
- * The map key should be the property name as a string, and the value should be a value
- * with a matching type for the property. For example, if a class has a String property
- * called name (ie. a getName()/setName() accessor pair), then you would use "name" as
- * the map key and a String object as the map value.
- * If any property in the map isn't valid (either an unknown name or a value of the wrong type)
- * the call will fail and an empty list will be returned.
- * It uses its own session.
- *
- * @param daoClass the actual class of the DAObjects
- * @param properties a map of property name/value pairs corresponding to properties
- * of the DAObject subclass
- * @return a list of DAObjects matching the class and the set of properties,
- * possibly empty if no match was found in the database or if the properties map
- * contains invalid entries or if a database access error occured
- */
- public List findObjectsByProperties(Class daoClass,
- Map properties );
-
- /**
- * A generic query method to retrieve a list of DAObjects of a same subclass
- * matching a set of properties and acquire a pessimistic row-level database lock
- * on each returned object in the list.
- * This results in an SQL query with the form "SELECT ... FOR UPDATE".
- * You may use this method to ensure that no other session can modify the returned objects
- * while the current session is active. This can help avoiding database-level deadlocks
- * when multiple sessions access and modify the same table in parallel.
- * The returned list contains the objects matching all of the properties specified.
- * It is parameterized to the actual type of DAObject queried so no downcast is needed.
- * The map key should be the property name as a string, and the value should be a value
- * with a matching type for the property. For example, if a class has a String property
- * called name (ie. a getName()/setName() accessor pair), then you would use "name" as
- * the map key and a String object as the map value.
- * If any property in the map isn't valid (either an unknown name or a value of the wrong type)
- * the call will fail and an empty list will be returned.
- * It uses its own session.
- *
- * @param daoClass the actual class of the DAObjects
- * @param properties a map of property name/value pairs corresponding to properties
- * of the DAObject subclass
- * @return a list of DAObjects matching the class and the set of properties,
- * possibly empty if no match was found in the database or if the properties map
- * contains invalid entries or if a database access error occured
- */
- public List findObjectsByPropertiesForUpdate(Class