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.InvoiceDAO;
import net.sourceforge.seqware.common.model.Invoice;
import net.sourceforge.seqware.common.model.InvoiceState;
import net.sourceforge.seqware.common.model.Registration;
import net.sourceforge.seqware.common.util.Log;
import net.sourceforge.seqware.common.util.NullBeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* <p>
* InvoiceDAOHibernate class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
public class InvoiceDAOHibernate extends HibernateDaoSupport implements InvoiceDAO {
final Logger localLogger = LoggerFactory.getLogger(InvoiceDAOHibernate.class);
/**
* <p>
* Constructor for InvoiceDAOHibernate.
* </p>
*/
public InvoiceDAOHibernate() {
super();
}
/** {@inheritDoc} */
@Override
public Integer insert(Invoice invoice) {
this.getHibernateTemplate().save(invoice);
this.getSession().flush();
return invoice.getSwAccession();
}
/** {@inheritDoc} */
@Override
public void update(Invoice invoice) {
getHibernateTemplate().update(invoice);
getSession().flush();
}
/** {@inheritDoc} */
@Override
public void delete(Invoice invoice) {
getHibernateTemplate().delete(invoice);
}
/**
* <p>
* list.
* </p>
*
* @return a {@link java.util.List} object.
*/
@Override
public List<Invoice> list() {
ArrayList<Invoice> invoices = new ArrayList<>();
List expmts;
// Limit the invoices to those owned by the user
expmts = this.getHibernateTemplate().find("from Invoice as invoice order by invoice.createTimestamp");
// expmts =
// this.getHibernateTemplate().find("from Invoice as invoice order by invoice.name desc");
for (Object invoice : expmts) {
invoices.add((Invoice) invoice);
}
return invoices;
}
/** {@inheritDoc} */
@Override
public List<Invoice> list(Registration registration) {
ArrayList<Invoice> invoices = new ArrayList<>();
// Limit the invoices to those owned by the user
String query;
Object[] parameters = { registration.getRegistrationId() };
if (registration.isLIMSAdmin()) {
query = "from Invoice as invoice order by createTimestamp";
parameters = null;
} else {
query = "from Invoice as invoice where invoice.owner.registrationId=? order by createTimestamp";
}
List list = this.getHibernateTemplate().find(query, parameters);
for (Object invoice : list) {
invoices.add((Invoice) invoice);
}
return invoices;
}
/** {@inheritDoc} */
@Override
public List<Invoice> list(Registration registration, InvoiceState state) {
ArrayList<Invoice> invoices = new ArrayList<>();
// Limit the invoices to those owned by the user
String query;
Object[] parameters;
if (registration.isLIMSAdmin()) {
query = "from Invoice as invoice where invoice.state = ? order by createTimestamp";
parameters = new Object[] { state.name() };
} else {
query = "from Invoice as invoice where invoice.owner.registrationId=? and invoice.state = ? order by createTimestamp";
parameters = new Object[] { registration.getRegistrationId(), state.name() };
}
List list = this.getHibernateTemplate().find(query, parameters);
for (Object invoice : list) {
invoices.add((Invoice) invoice);
}
return invoices;
}
/** {@inheritDoc} */
@Override
public Invoice findByID(Integer wfID) {
String query = "from Invoice as invoice where invoice.invoiceId = ?";
Invoice invoice = null;
Object[] parameters = { wfID };
List list = this.getHibernateTemplate().find(query, parameters);
if (list.size() > 0) {
invoice = (Invoice) list.get(0);
}
return invoice;
}
/** {@inheritDoc} */
@Override
public Invoice findBySWAccession(Integer swAccession) {
String query = "from Invoice as invoice where invoice.swAccession = ?";
Invoice invoice = null;
Object[] parameters = { swAccession };
List<Invoice> list = this.getHibernateTemplate().find(query, parameters);
if (list.size() > 0) {
invoice = (Invoice) list.get(0);
} else {
Log.error("Could not find invoice of swaccession = " + swAccession);
}
return invoice;
}
/** {@inheritDoc} */
@Override
public Invoice updateDetached(Invoice invoice) {
Invoice dbObject = findByID(invoice.getInvoiceId());
try {
BeanUtilsBean beanUtils = new NullBeanUtils();
beanUtils.copyProperties(dbObject, invoice);
return (Invoice) this.getHibernateTemplate().merge(dbObject);
} catch (IllegalAccessException | InvocationTargetException e) {
localLogger.error("Error updating detached invoice", e);
}
return null;
}
/** {@inheritDoc} */
@Override
public void update(Registration registration, Invoice invoice) {
Invoice dbObject = reattachInvoice(invoice);
if (registration == null) {
localLogger.error("InvoiceDAOHibernate update: Registration is null - exiting");
} else if (registration.isLIMSAdmin() || (invoice.givesPermission(registration) && dbObject.givesPermission(registration))) {
localLogger.info("Updating invoice object");
update(invoice);
} else {
localLogger.error("InvoiceDAOHibernate update: Registration is incorrect - exiting");
}
}
/** {@inheritDoc} */
@Override
public Integer insert(Registration registration, Invoice invoice) {
if (registration == null) {
localLogger.error("InvoiceDAOHibernate insert: Registration is null - exiting");
} else {
localLogger.info("insert invoice object");
return insert(invoice);
}
return null;
}
/** {@inheritDoc} */
@Override
public Invoice updateDetached(Registration registration, Invoice invoice) {
Invoice dbObject = reattachInvoice(invoice);
if (registration == null) {
localLogger.error("InvoiceDAOHibernate updateDetached: Registration is null - exiting");
} else if (registration.isLIMSAdmin() || dbObject.givesPermission(registration)) {
localLogger.info("updateDetached invoice object");
return updateDetached(invoice);
} else {
localLogger.error("InvoiceDAOHibernate updateDetached: Registration is incorrect - exiting");
}
return null;
}
private Invoice reattachInvoice(Invoice invoice) throws IllegalStateException {
Invoice dbObject = invoice;
if (!getSession().contains(invoice)) {
dbObject = findByID(invoice.getInvoiceId());
}
return dbObject;
}
}