package ee.telekom.workflow.core.workflowinstance; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.List; import org.springframework.stereotype.Repository; import ee.telekom.workflow.util.AbstractWorkflowEngineDao; import ee.telekom.workflow.util.AdvancedParameterSource; @Repository public class WorkflowInstanceDao extends AbstractWorkflowEngineDao{ public void create( WorkflowInstance woin ){ long refNum = getNextSequenceValue( getSchema() + "woin_ref_num_s" ); woin.setRefNum( refNum ); String sql = "" + "INSERT INTO " + getSchema() + "workflow_instances " + " (ref_num, workflow_name, workflow_version, attributes, state, label1, label2, cluster_name, locked, status, date_created, created_by) " + " VALUES " + " (:refNum, :workflowName, :workflowVersion, :attributes, :state, :label1, :label2, :clusterName, :locked, :status, :dateCreated, :createdBy)"; AdvancedParameterSource source = new AdvancedParameterSource() .addBean( woin ) .addValue( "dateCreated", new Date() ) .addValue( "createdBy", getCreatedOrLastUpdatedBy() ); getNamedParameterJdbcTemplate().update( sql, source ); } public WorkflowInstance findByRefNum( long refNum ){ String sql = "SELECT * FROM " + getSchema() + "workflow_instances WHERE ref_num = ?"; Object[] args = {refNum}; List<WorkflowInstance> results = getJdbcTemplate().query( sql, args, WorkflowInstanceRowMapper.INSTANCE ); return results.isEmpty() ? null : results.get( 0 ); } public WorkflowInstanceStatus findStatusByRefNum( long refNum ){ String sql = "SELECT status FROM " + getSchema() + "workflow_instances WHERE ref_num = ?"; Object[] args = {refNum}; List<String> results = getJdbcTemplate().queryForList( sql, args, String.class ); return results.isEmpty() ? null : WorkflowInstanceStatus.valueOf(results.get( 0 ) ); } public boolean updateAndUnlock( long refNum, int workflowVersion, String attributes, String history, String state, WorkflowInstanceStatus newStatus, Collection<WorkflowInstanceStatus> expectedStatuses ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET workflow_version = :workflowVersion, " + " attributes = :attributes, " + " history = :history, " + " state = :state, " + " locked = :locked, " + " node_name = :nodeName, " + " status = :status, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE ref_num = :refNum " + " AND status IN (:expectedStatuses)"; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "refNum", refNum ) .addValue( "workflowVersion", workflowVersion ) .addValue( "attributes", attributes ) .addValue( "history", history ) .addValue( "state", state ) .addValue( "locked", false ) .addValue( "nodeName", null ) .addValue( "status", newStatus ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ) .addValue( "expectedStatuses", expectedStatuses ); int count = getNamedParameterJdbcTemplate().update( sql, source ); return (count == 1); } public boolean updateStatus( long refNum, WorkflowInstanceStatus newStatus, Collection<WorkflowInstanceStatus> expectedStatuses ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET status = :newStatus, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE ref_num = :refNum " + " AND status IN (:expectedStatuses)"; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "refNum", refNum ) .addValue( "newStatus", newStatus ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ) .addValue( "expectedStatuses", expectedStatuses ); int count = getNamedParameterJdbcTemplate().update( sql, source ); return (count == 1); } public int recover( String nodeName, WorkflowInstanceStatus status, WorkflowInstanceStatus recoveredStatus ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET status = :recoveredStatus, " + " locked = :recoveredLocked," + " node_name = NULL, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE node_name = :nodeName " + " AND status = :status "; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "recoveredStatus", recoveredStatus ) .addValue( "recoveredLocked", false ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ) .addValue( "nodeName", nodeName ) .addValue( "status", status ); int count = getNamedParameterJdbcTemplate().update( sql, source ); return count; } public int recoverNotAssigned( String clusterName ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET locked = :recoveredLocked," + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE cluster_name = :clusterName " + " AND node_name IS NULL " + " AND locked = :locked " + " AND status IN (:expectedStatuses)"; Collection<WorkflowInstanceStatus> expectedStatuses = Arrays.asList( WorkflowInstanceStatus.NEW, WorkflowInstanceStatus.EXECUTING, WorkflowInstanceStatus.ABORT ); AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "recoveredLocked", false ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ) .addValue( "clusterName", clusterName ) .addValue( "locked", true ) .addValue( "expectedStatuses", expectedStatuses ); int count = getNamedParameterJdbcTemplate().update( sql, source ); return count; } public void updateLock( List<Long> refNums, boolean locked ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET locked = :locked, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE ref_num in (:refNums) "; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "refNums", refNums ) .addValue( "locked", locked ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ); getNamedParameterJdbcTemplate().update( sql, source ); } public void updateNodeName( long refNum, String nodeName ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET node_name = :nodeName, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE ref_num = :refNum "; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ) .addValue( "refNum", refNum ) .addValue( "nodeName", nodeName ); getNamedParameterJdbcTemplate().update( sql, source ); } public void updateLockAndNodeName( long refNum, boolean locked, String nodeName ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET locked = :locked, " + " node_name = :nodeName, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE ref_num = :refNum "; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "refNum", refNum ) .addValue( "locked", locked ) .addValue( "nodeName", nodeName ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ); getNamedParameterJdbcTemplate().update( sql, source ); } public boolean updateState( long refNum, String state, WorkflowInstanceStatus expectedStatus ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET state = :state, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE ref_num = :refNum " + " AND status = :expectedStatus"; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "refNum", refNum ) .addValue( "state", state ) .addValue( "expectedStatus", expectedStatus ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ); int count = getNamedParameterJdbcTemplate().update( sql, source ); return (count == 1); } public boolean updateHistory( Long refNum, String history, WorkflowInstanceStatus expectedStatus ){ String sql = "" + "UPDATE " + getSchema() + "workflow_instances " + " SET history = :history, " + " date_updated = :dateUpdated, " + " last_updated_by = :lastUpdatedBy " + " WHERE ref_num = :refNum " + " AND status = :expectedStatus"; AdvancedParameterSource source = new AdvancedParameterSource() .addValue( "refNum", refNum ) .addValue( "history", history ) .addValue( "expectedStatus", expectedStatus ) .addValue( "dateUpdated", new Date() ) .addValue( "lastUpdatedBy", getCreatedOrLastUpdatedBy() ); int count = getNamedParameterJdbcTemplate().update( sql, source ); return (count == 1); } }