package net.sourceforge.seqware.common.dao.hibernate;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.sourceforge.seqware.common.dao.SequencerRunDAO;
import net.sourceforge.seqware.common.model.Registration;
import net.sourceforge.seqware.common.model.SequencerRun;
import net.sourceforge.seqware.common.model.SequencerRunWizardDTO;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* <p>
* SequencerRunDAOHibernate class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
public class SequencerRunDAOHibernate extends HibernateDaoSupport implements SequencerRunDAO {
final Logger localLogger = LoggerFactory.getLogger(SequencerRunDAOHibernate.class);
/**
* <p>
* Constructor for SequencerRunDAOHibernate.
* </p>
*/
public SequencerRunDAOHibernate() {
super();
}
/**
* {@inheritDoc}
*
* @return
*/
@Override
public Integer insert(SequencerRun sequencerRun) {
this.getHibernateTemplate().save(sequencerRun);
getSession().flush();
return (sequencerRun.getSwAccession());
}
/**
* <p>
* insert.
* </p>
*
* @param sequencerRun
* a {@link net.sourceforge.seqware.common.model.SequencerRunWizardDTO} object.
* @return
*/
@Override
public Integer insert(SequencerRunWizardDTO sequencerRun) {
this.getHibernateTemplate().save(sequencerRun);
getSession().flush();
return (sequencerRun.getSwAccession());
}
/** {@inheritDoc} */
@Override
public void update(SequencerRun sequencerRun) {
this.getHibernateTemplate().update(sequencerRun);
getSession().flush();
}
/** {@inheritDoc} */
@Override
public void delete(SequencerRun sequencerRun) {
this.getHibernateTemplate().delete(sequencerRun);
}
/** {@inheritDoc} */
@Override
public List<SequencerRun> list(Registration registration, Boolean isAsc) {
ArrayList<SequencerRun> sequencerRuns = new ArrayList<>();
if (registration == null) {
return sequencerRuns;
}
/*
* List list = this.getHibernateTemplate().find( "from SequencerRun as sequencerRun order by create_tstmp desc" "from SequencerRun
* as sequencerRun where sequencerRun.owner.registrationId=? order by create_tstmp desc" );
*/
String query;
Object[] parameters = { registration.getRegistrationId() };
String sortValue = (!isAsc) ? "asc" : "desc";
List list;
if (registration.isLIMSAdmin()) {
// select distinct f from Foo f
query = "select * from sequencer_run as sr order by sr.create_tstmp " + sortValue + ";";
// query = "from SequencerRun as sr where sr.sequencerRunId in ( "
// +
// " select distinct sequencerRun.sequencerRunId from(select sequencerRun.sequencerRunId, sequencerRun.createTimestamp "
// +
// " from SequencerRun as sequencerRun order by sequencerRun.createTimestamp asc ))";
parameters = null;
list = this.getSession().createSQLQuery(query).addEntity(SequencerRun.class).list();
} else {
query = "select * from sequencer_run as sr where sr.owner_id = ? order by sr.create_tstmp " + sortValue + ";";
// query =
// "from SequencerRun as sequencerRun where sequencerRun.owner.registrationId=? "
// +
// "order by sequencerRun.createTimestamp " + sortValue;
list = this.getSession().createSQLQuery(query).addEntity(SequencerRun.class).setInteger(0, registration.getRegistrationId())
.list();
}
for (Object obj : list) {
SequencerRun sr = (SequencerRun) obj;
sequencerRuns.add(sr);
}
// List list = this.getHibernateTemplate().find(query, parameters);
// for(Object sequencerRun : list) {
// sequencerRuns.add((SequencerRun)sequencerRun);
// }
// Limit the sequencerRuns to those owned by the user
/*
* expmts = this.getHibernateTemplate().find( "from SequencerRun as sequencerRun where owner_id = ? order by sequencerRun.name desc"
* , registration.getRegistrationId() );
*/
// expmts =
// this.getHibernateTemplate().find("from SequencerRun as sequencerRun order by sequencerRun.name desc");
// FIXME: why am I getting multiple values back?
/*
* HashMap map = new HashMap(); for(Object sequencerRun : expmts) { if
* (!map.containsKey(((SequencerRun)sequencerRun).getSequencerRunId())) { boolean add = false; Registration currOwner =
* ((SequencerRun)sequencerRun).getOwner(); if (registration.isLIMSAdmin()) add = true; else if (currOwner != null &&
* currOwner.getRegistrationId().equals(registration.getRegistrationId())) add = true; else { for (Lane lane :
* ((SequencerRun)sequencerRun).getLanes()) { if (lane.getOwner() != null && lane
* .getOwner().getRegistrationId().equals(registration.getRegistrationId())) add = true; for (IUS ius : lane.getIUS()) { if
* (ius.getOwner() != null && ius .getOwner().getRegistrationId().equals(registration.getRegistrationId())) add = true; } } } if
* (add) { sequencerRuns.add((SequencerRun)sequencerRun); map.put(((SequencerRun)sequencerRun).getSequencerRunId(), "");
* //System.err .println(" Adding sequencer run! "+((SequencerRun)sequencerRun ).getSequencerRunId()); } } }
*/
return sequencerRuns;
}
/**
* {@inheritDoc}
*
* Finds an instance of SequencerRun in the database by the SequencerRun name.
*/
@Override
public SequencerRun findByName(String name) {
String query = "from SequencerRun as sequencerRun where sequencerRun.name = ?";
SequencerRun sequencerRun = null;
Object[] parameters = { name };
List list = this.getHibernateTemplate().find(query, parameters);
if (list.size() > 0) {
sequencerRun = (SequencerRun) list.get(0);
}
return sequencerRun;
}
/**
* {@inheritDoc}
*
* Finds an instance of SequencerRun in the database by the SequencerRun ID.
*/
@Override
public SequencerRun findByID(Integer expID) {
String query = "from SequencerRun as sequencerRun where sequencerRun.sequencerRunId = ?";
SequencerRun sequencerRun = null;
Object[] parameters = { expID };
List list = this.getHibernateTemplate().find(query, parameters);
if (list.size() > 0) {
sequencerRun = (SequencerRun) list.get(0);
}
return sequencerRun;
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public SequencerRun findBySWAccession(Integer swAccession) {
String query = "from SequencerRun as sequencerRun where sequencerRun.swAccession = ?";
SequencerRun sequencerRun = null;
Object[] parameters = { swAccession };
List<SequencerRun> list = this.getHibernateTemplate().find(query, parameters);
if (list.size() > 0) {
sequencerRun = (SequencerRun) list.get(0);
}
return sequencerRun;
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public List<SequencerRun> findByOwnerID(Integer registrationId) {
String query = "from SequencerRun as sequencerRun where sequencerRun.owner.registrationId = ?";
Object[] parameters = { registrationId };
return this.getHibernateTemplate().find(query, parameters);
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public List<SequencerRun> findByCriteria(String criteria, boolean isCaseSens) {
String queryStringCase = "from SequencerRun as sr where " + " sr.description like :description "
+ " or cast(sr.swAccession as string) like :sw " + " or sr.name like :name order by sr.description ";
String queryStringICase = "from SequencerRun as sr where " + " lower(sr.description) like :description "
+ " or cast(sr.swAccession as string) like :sw " + " or lower(sr.name) like :name order by sr.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);
List<SequencerRun> res = query.list();
filterResult(res);
return res;
}
/**
* Filter WizardDTO classes here
*
* @param res
*/
private void filterResult(List<SequencerRun> res) {
Iterator<SequencerRun> iter = res.iterator();
while (iter.hasNext()) {
SequencerRun val = iter.next();
if (val instanceof SequencerRunWizardDTO) {
iter.remove();
}
}
}
/** {@inheritDoc} */
@Override
public SequencerRun updateDetached(SequencerRun sequencerRun) {
SequencerRun dbObject = reattachSequencerRun(sequencerRun);
try {
BeanUtilsBean beanUtils = new NullBeanUtils();
beanUtils.copyProperties(dbObject, sequencerRun);
return (SequencerRun) this.getHibernateTemplate().merge(dbObject);
} catch (IllegalAccessException | InvocationTargetException e) {
localLogger.error("Error updating detached SequencerRun", e);
}
return null;
}
/** {@inheritDoc} */
@Override
public List<SequencerRun> list() {
ArrayList<SequencerRun> sequencerRuns = new ArrayList<>();
// SEQWARE-1489
// bizarre, my initial thought was to restrict this to the base class
// however, certain SequencerRuns in the test database get dropped that way
String query = "from SequencerRunWizardDTO as sr";
List list = this.getHibernateTemplate().find(query);
Log.trace("Hibernate query found " + list.size() + "sequencer runs");
for (Object obj : list) {
SequencerRun sr = (SequencerRun) obj;
sequencerRuns.add(sr);
}
return sequencerRuns;
}
/** {@inheritDoc} */
@Override
public void update(Registration registration, SequencerRun sequencerRun) {
SequencerRun dbObject = reattachSequencerRun(sequencerRun);
if (registration == null) {
localLogger.error("SequencerRunDAOHibernate update registration is null");
} else if (registration.isLIMSAdmin() || (sequencerRun.givesPermission(registration) && dbObject.givesPermission(registration))) {
localLogger.info("Updating sequencer run object");
update(sequencerRun);
} else {
localLogger.error("sequencerRunDAOHibernate update not authorized");
}
}
/**
* {@inheritDoc}
*
* @return
*/
@Override
public Integer insert(Registration registration, SequencerRun sequencerRun) {
if (registration == null) {
localLogger.error("SequencerRunDAOHibernate insert SequencerRun registration is null");
} else if (registration.isLIMSAdmin() || sequencerRun.givesPermission(registration)) {
localLogger.info("insert sequencer run object");
insert(sequencerRun);
return (sequencerRun.getSwAccession());
} else {
localLogger.error("sequencerRunDAOHibernate insert not authorized");
}
return null;
}
/**
* {@inheritDoc}
*
* @return
*/
@Override
public Integer insert(Registration registration, SequencerRunWizardDTO sequencerRun) {
if (registration == null) {
localLogger.error("SequencerRunDAOHibernate insert SequencerRunWizardDTO registration is null");
} else if (registration.isLIMSAdmin() || sequencerRun.givesPermission(registration)) {
localLogger.info("insert SequencerRunWizardDTO object");
insert(sequencerRun);
return (sequencerRun.getSwAccession());
} else {
localLogger.error("sequencerRunDAOHibernate insert not authorized");
}
return null;
}
/** {@inheritDoc} */
@Override
public SequencerRun updateDetached(Registration registration, SequencerRun sequencerRun) {
SequencerRun dbObject = reattachSequencerRun(sequencerRun);
if (registration == null) {
localLogger.error("SequencerRunDAOHibernate updateDetached registration is null");
} else if (registration.isLIMSAdmin() || dbObject.givesPermission(registration)) {
localLogger.info("updateDetached SequencerRun object");
return updateDetached(sequencerRun);
} else {
localLogger.error("sequencerRunDAOHibernate updateDetached not authorized");
}
return null;
}
private SequencerRun reattachSequencerRun(SequencerRun sequencerRun) throws IllegalStateException, DataAccessResourceFailureException {
SequencerRun dbObject = sequencerRun;
if (!getSession().contains(sequencerRun)) {
dbObject = findByID(sequencerRun.getSequencerRunId());
}
return dbObject;
}
}