package ee.telekom.workflow.core.lock; import java.util.Date; import java.util.List; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Repository; import ee.telekom.workflow.util.AbstractWorkflowEngineDao; import ee.telekom.workflow.util.AdvancedParameterSource; @Repository public class LockDao extends AbstractWorkflowEngineDao{ public boolean create( String clusterName, String owner, Date expireTime ){ String sql = "INSERT INTO " + getSchema() + "locks (cluster_name, owner, expire_time) VALUES (?, ?, ?)"; Object[] args = {clusterName, owner, expireTime}; try{ int count = getJdbcTemplate().update( sql, args ); return count == 1; } catch( DuplicateKeyException e ){ // Cluster_name is the primary key. There may not be two locks for the same cluster. return false; } } public boolean deleteByOwner( String clusterName, String owner ){ String sql = "DELETE FROM " + getSchema() + "locks WHERE cluster_name = ? AND owner = ?"; Object[] args = {clusterName, owner}; int count = getJdbcTemplate().update( sql, args ); boolean isDeleted = (count == 1); return isDeleted; } public boolean deleteByExpireTime( String clusterName, Date expireTime ){ String sql = "DELETE FROM " + getSchema() + "locks WHERE cluster_name = ? AND expire_time < ?"; Object[] args = {clusterName, expireTime}; int count = getJdbcTemplate().update( sql, args ); boolean isDeleted = (count == 1); return isDeleted; } public boolean updateExpireTime( String clusterName, String nodeName, Date expireTime ){ String sql = "" + "UPDATE " + getSchema() + "locks " + " SET expire_time = :expireTime " + " WHERE cluster_name = :clusterName " + " AND owner = :nodeName"; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "expireTime", expireTime ) .addValue( "clusterName", clusterName ) .addValue( "nodeName", nodeName ); int count = getNamedParameterJdbcTemplate().update( sql, source ); boolean isUpdated = (count == 1); return isUpdated; } public String findOwner( String clusterName ){ String sql = "SELECT owner FROM " + getSchema() + "locks WHERE cluster_name = ?"; Object[] args = {clusterName}; List<String> result = getJdbcTemplate().queryForList( sql, String.class, args ); return result.isEmpty() ? null : result.get( 0 ); } public Date findExpireTime( String clusterName ){ String sql = "SELECT expire_time FROM " + getSchema() + "locks WHERE cluster_name = ?"; Object[] args = {clusterName}; List<Date> result = getJdbcTemplate().queryForList( sql, Date.class, args ); return result.isEmpty() ? null : result.get( 0 ); } }