package ee.telekom.workflow.core.archive;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import ee.telekom.workflow.core.workflowinstance.WorkflowInstance;
import ee.telekom.workflow.core.workflowinstance.WorkflowInstanceRowMapper;
import ee.telekom.workflow.core.workitem.WorkItem;
import ee.telekom.workflow.core.workitem.WorkItemRowMapper;
import ee.telekom.workflow.util.AbstractWorkflowEngineDao;
import ee.telekom.workflow.util.AdvancedParameterSource;
@Repository
public class ArchiveDao extends AbstractWorkflowEngineDao{
public void archive( long woinRefNum ){
createArchiveWorkflowInstance( woinRefNum );
createArchiveWorkItems( woinRefNum );
deleteOriginalWorkItems( woinRefNum );
deleteOriginalWorkflowInstance( woinRefNum );
}
private void createArchiveWorkflowInstance( long woinRefNum ){
Map<String, Object> old = getJdbcTemplate().queryForMap( "SELECT * FROM " + getSchema() + "workflow_instances WHERE ref_num = ?", woinRefNum );
String sql = ""
+ "INSERT INTO " + getSchema() + "workflow_instances_archive "
+ " (ref_num, workflow_name, workflow_version, attributes, state, history, label1, label2, cluster_name, locked, status, date_created, created_by, date_updated, last_updated_by) "
+ " VALUES "
+ " (:ref_num, :workflow_name, :workflow_version, :attributes, :state, :history, :label1, :label2, :cluster_name, :locked, :status, :date_created, :created_by, :date_updated, :last_updated_by)";
AdvancedParameterSource source = new AdvancedParameterSource().addMapWithLowercaseKeys( old );
getNamedParameterJdbcTemplate().update( sql, source );
}
private void createArchiveWorkItems( long woinRefNum ){
List<Map<String, Object>> old = getJdbcTemplate().queryForList( "SELECT * FROM " + getSchema() + "work_items WHERE woin_ref_num = ?", woinRefNum );
String sql = ""
+ "INSERT INTO " + getSchema() + "work_items_archive "
+ " (ref_num, woin_ref_num, token_id, signal, due_date, bean, method, role, user_name, arguments, result, status, date_created, created_by, date_updated, last_updated_by) "
+ " VALUES "
+ " (:ref_num, :woin_ref_num, :token_id, :signal, :due_date, :bean, :method, :role, :user_name, :arguments, :result, :status, :date_created, :created_by, :date_updated, :last_updated_by)";
AdvancedParameterSource[] sources = new AdvancedParameterSource[old.size()];
for( int i = 0; i < old.size(); i++ ){
sources[i] = new AdvancedParameterSource().addMapWithLowercaseKeys( old.get( i ) );
}
getNamedParameterJdbcTemplate().batchUpdate( sql, sources );
getJdbcTemplate().update( "DELETE FROM " + getSchema() + "work_items WHERE woin_ref_num = ?", woinRefNum );
}
private void deleteOriginalWorkflowInstance( long woinRefNum ){
getJdbcTemplate().update( "DELETE FROM " + getSchema() + "workflow_instances WHERE ref_num = ?", woinRefNum );
}
private void deleteOriginalWorkItems( long woinRefNum ){
getJdbcTemplate().update( "DELETE FROM " + getSchema() + "work_items WHERE woin_ref_num = ?", woinRefNum );
}
public WorkflowInstance findWoinByRefNum( long refNum ){
String sql = "SELECT * FROM " + getSchema() + "workflow_instances_archive WHERE ref_num = ?";
Object[] args = {refNum};
List<WorkflowInstance> results = getJdbcTemplate().query( sql, args, WorkflowInstanceRowMapper.INSTANCE );
return results.isEmpty() ? null : results.get( 0 );
}
public WorkItem findWoitByRefNum( long refNum ){
String sql = "SELECT * FROM " + getSchema() + "work_items_archive WHERE ref_num = ?";
Object[] args = {refNum};
List<WorkItem> results = getJdbcTemplate().query( sql, args, WorkItemRowMapper.INSTANCE );
return results.isEmpty() ? null : results.get( 0 );
}
public List<WorkItem> findWoitsByWoinRefNum( long woinRefNum ){
String sql = "SELECT * FROM " + getSchema() + "work_items_archive WHERE woin_ref_num = ?";
Object[] args = {woinRefNum};
return getJdbcTemplate().query( sql, args, WorkItemRowMapper.INSTANCE );
}
}