package net.sourceforge.seqware.common.dao.hibernate;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.seqware.common.dao.WorkflowDAO;
import net.sourceforge.seqware.common.model.Registration;
import net.sourceforge.seqware.common.model.SequencerRun;
import net.sourceforge.seqware.common.model.Workflow;
import net.sourceforge.seqware.common.util.Log;
import net.sourceforge.seqware.common.util.NullBeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* <p>
* WorkflowDAOHibernate class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
public class WorkflowDAOHibernate extends HibernateDaoSupport implements WorkflowDAO {
final Logger localLogger = LoggerFactory.getLogger(WorkflowDAOHibernate.class);
/**
* <p>
* Constructor for WorkflowDAOHibernate.
* </p>
*/
public WorkflowDAOHibernate() {
super();
}
/** {@inheritDoc} */
@Override
public Integer insert(Workflow workflow) {
this.getHibernateTemplate().save(workflow);
this.getSession().flush();
return workflow.getSwAccession();
}
/** {@inheritDoc} */
@Override
public void update(Workflow workflow) {
getHibernateTemplate().update(workflow);
getSession().flush();
}
/** {@inheritDoc} */
@Override
public void delete(Workflow workflow) {
getHibernateTemplate().delete(workflow);
}
/**
* <p>
* list.
* </p>
*
* @return a {@link java.util.List} object.
*/
@Override
public List<Workflow> list() {
ArrayList<Workflow> workflows = new ArrayList<>();
List expmts;
// Limit the workflows to those owned by the user
expmts = this.getHibernateTemplate().find("from Workflow as workflow order by workflow.name, workflow.version desc");
// expmts =
// this.getHibernateTemplate().find("from Workflow as workflow order by workflow.name desc");
for (Object workflow : expmts) {
workflows.add((Workflow) workflow);
}
return workflows;
}
/** {@inheritDoc} */
@Override
public List<Workflow> list(Registration registration) {
ArrayList<Workflow> workflows = new ArrayList<>();
// Limit the workflows to those owned by the user
String query;
Object[] parameters = { registration.getRegistrationId() };
if (registration.isLIMSAdmin()) {
query = "from Workflow as workflow order by create_tstmp desc ";
parameters = null;
} else {
query = "from Workflow as workflow where workflow.owner.registrationId=? order by create_tstmp desc";
}
List list = this.getHibernateTemplate().find(query, parameters);
for (Object workflow : list) {
workflows.add((Workflow) workflow);
}
return workflows;
}
/** {@inheritDoc} */
@Override
public List<Workflow> listMyShared(Registration registration) {
List<Workflow> sharedWorkflows = new ArrayList<>();
List<Workflow> workflows = list(registration);
for (Workflow workflow : workflows) {
/*
* if(!workflow.getSharedStudies().isEmpty()){ sharedWorkflows.add(study); }
*/
}
return sharedWorkflows;
}
/** {@inheritDoc} */
@Override
public List<Workflow> listSharedWithMe(Registration registration) {
return new ArrayList<>();
}
/** {@inheritDoc} */
@Override
public List<Workflow> findByName(String name) {
String query = "from Workflow as workflow where workflow.name = ?";
Object[] parameters = { name };
List list = this.getHibernateTemplate().find(query, parameters);
return list;
}
/** {@inheritDoc} */
@Override
public Workflow findByID(Integer wfID) {
String query = "from Workflow as workflow where workflow.workflowId = ?";
Workflow workflow = null;
Object[] parameters = { wfID };
List list = this.getHibernateTemplate().find(query, parameters);
if (list.size() > 0) {
workflow = (Workflow) list.get(0);
}
return workflow;
}
/** {@inheritDoc} */
@Override
public Workflow findBySWAccession(Integer swAccession) {
String query = "from Workflow as workflow where workflow.swAccession = ?";
Workflow workflow = null;
Object[] parameters = { swAccession };
List<Workflow> list = this.getHibernateTemplate().find(query, parameters);
if (list.size() > 0) {
workflow = (Workflow) list.get(0);
} else {
Log.error("Could not find workflow of swaccession = " + swAccession);
}
return workflow;
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public List<Workflow> findByCriteria(String criteria, boolean isCaseSens) {
String queryStringCase = "from Workflow as w where w.description like :description "
+ " or cast(w.swAccession as string) like :sw " + " or w.name like :name order by w.name, w.description";
String queryStringICase = "from Workflow as w where lower(w.description) like :description "
+ " or cast(w.swAccession as string) like :sw " + " or lower(w.name) like :name order by w.name, w.description";
Query query = isCaseSens ? this.getSession().createQuery(queryStringCase) : this.getSession().createQuery(queryStringICase);
if (!isCaseSens) {
criteria = criteria.toLowerCase();
}
criteria = "%" + criteria + "%";
query.setString("description", criteria);
query.setString("sw", criteria);
query.setString("name", criteria);
return query.list();
}
/** {@inheritDoc} */
@Override
public Workflow updateDetached(Workflow workflow) {
Workflow dbObject = findByID(workflow.getWorkflowId());
try {
BeanUtilsBean beanUtils = new NullBeanUtils();
beanUtils.copyProperties(dbObject, workflow);
return (Workflow) this.getHibernateTemplate().merge(dbObject);
} catch (IllegalAccessException | InvocationTargetException e) {
localLogger.error("Error updating detached workflow", e);
}
return null;
}
/** {@inheritDoc} */
@Override
public void update(Registration registration, Workflow workflow) {
Workflow dbObject = reattachWorkflow(workflow);
if (registration == null) {
localLogger.error("WorkflowDAOHibernate update: Registration is null - exiting");
} else if (registration.isLIMSAdmin() || (workflow.givesPermission(registration) && dbObject.givesPermission(registration))) {
localLogger.info("Updating workflow object");
update(workflow);
} else {
localLogger.error("WorkflowDAOHibernate update: Registration is incorrect - exiting");
}
}
/** {@inheritDoc} */
@Override
public Integer insert(Registration registration, Workflow workflow) {
if (registration == null) {
localLogger.error("WorkflowDAOHibernate insert: Registration is null - exiting");
} else {
localLogger.info("insert workflow object");
return insert(workflow);
}
return null;
// else if (registration.equals(workflow.getOwner())) {
// logger.info("insert workflow object");
// insert(workflow);
// } else {
// logger.error("WorkflowDAOHibernate update: Registration is incorrect - exiting");
// }
}
/** {@inheritDoc} */
@Override
public List<Workflow> listWorkflows(SequencerRun sr) {
String query;
if (sr != null) {
query = "select distinct w.* from sequencer_run sr " + "join processing_sequencer_runs psr "
+ "on (sr.sequencer_run_id = psr.sequencer_run_id) " + "join processing p "
+ "on (p.processing_id = psr.processing_id) " + "join workflow_run wr "
+ "on (wr.workflow_run_id = p.workflow_run_id) " + "join workflow w " + "on (w.workflow_id = wr.workflow_id) "
+ "where sr.sequencer_run_id = :seq_run_id " + "union " + "select distinct w.* from sequencer_run sr "
+ "join lane l " + "on (l.sequencer_run_id = sr.sequencer_run_id) " + "join ius i " + "on (i.lane_id = l.lane_id) "
+ "join ius_workflow_runs iwr " + "on (iwr.ius_id = i.ius_id) " + "join workflow_run wr "
+ "on (wr.workflow_run_id = iwr.workflow_run_id) " + "join workflow w " + "on (w.workflow_id = wr.workflow_id) "
+ "where sr.sequencer_run_id = :seq_run_id ";
} else {
query = "select distinct w.* from sequencer_run sr " + "join processing_sequencer_runs psr "
+ "on (sr.sequencer_run_id = psr.sequencer_run_id) " + "join processing p "
+ "on (p.processing_id = psr.processing_id) " + "join workflow_run wr "
+ "on (wr.workflow_run_id = p.workflow_run_id) " + "join workflow w " + "on (w.workflow_id = wr.workflow_id) "
+ "union " + "select distinct w.* from sequencer_run sr " + "join lane l "
+ "on (l.sequencer_run_id = sr.sequencer_run_id) " + "join ius i " + "on (i.lane_id = l.lane_id) "
+ "join ius_workflow_runs iwr " + "on (iwr.ius_id = i.ius_id) " + "join workflow_run wr "
+ "on (wr.workflow_run_id = iwr.workflow_run_id) " + "join workflow w " + "on (w.workflow_id = wr.workflow_id) ";
}
SQLQuery sqlQuery = this.getSession().createSQLQuery(query);
if (sr != null) {
sqlQuery.setInteger("seq_run_id", sr.getSequencerRunId());
}
@SuppressWarnings("rawtypes")
List result = sqlQuery.addEntity(Workflow.class).list();
List<Workflow> workflows = new ArrayList<>(result.size());
for (Object obj : result) {
workflows.add((Workflow) obj);
}
return workflows;
}
/** {@inheritDoc} */
@Override
public Workflow updateDetached(Registration registration, Workflow workflow) {
Workflow dbObject = reattachWorkflow(workflow);
if (registration == null) {
localLogger.error("WorkflowDAOHibernate updateDetached: Registration is null - exiting");
} else if (registration.isLIMSAdmin() || dbObject.givesPermission(registration)) {
localLogger.info("updateDetached workflow object");
return updateDetached(workflow);
} else {
localLogger.error("WorkflowDAOHibernate updateDetached: Registration is incorrect - exiting");
}
return null;
}
private Workflow reattachWorkflow(Workflow workflow) throws IllegalStateException {
Workflow dbObject = workflow;
if (!getSession().contains(workflow)) {
dbObject = findByID(workflow.getWorkflowId());
}
return dbObject;
}
}