package edu.ualberta.med.biobank.common.wrappers.actions;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import edu.ualberta.med.biobank.common.peer.SpecimenPeer;
import edu.ualberta.med.biobank.common.wrappers.Property;
import edu.ualberta.med.biobank.common.wrappers.SpecimenWrapper;
import edu.ualberta.med.biobank.common.wrappers.util.ProxyUtil;
import edu.ualberta.med.biobank.model.Specimen;
import edu.ualberta.med.biobank.server.applicationservice.exceptions.BiobankSessionException;
public class UpdateChildrensTopSpecimenAction extends WrapperAction<Specimen> {
private static final long serialVersionUID = 1L;
// @formatter:off
@SuppressWarnings("nls")
private static final String UPDATE_CHILDREN_HQL =
"UPDATE "+Specimen.class.getName()+" s " +
"SET s."+SpecimenPeer.TOP_SPECIMEN.getName()+" = ? " +
"WHERE s."+SpecimenPeer.PARENT_SPECIMEN.to(SpecimenPeer.ID).getName()+" IN ({0})";
@SuppressWarnings("nls")
private static final String SELECT_CHILDREN_HQL =
"SELECT s."+Property.concatNames(SpecimenPeer.CHILD_SPECIMENS, SpecimenPeer.ID)+" " +
"FROM "+Specimen.class.getName()+" s " +
"WHERE s."+SpecimenPeer.ID.getName()+" IN ({0})";
// @formatter:on
private final Specimen topSpecimen;
public UpdateChildrensTopSpecimenAction(SpecimenWrapper wrapper) {
super(wrapper);
this.topSpecimen = ProxyUtil.convertProxyToObject(wrapper
.getTopSpecimen().getWrappedObject());
}
@Override
public Object doAction(Session session) throws BiobankSessionException {
List<Integer> ids = Arrays.asList(getModel().getId());
updateChildren(session, ids);
return null;
}
private void updateChildren(Session session, List<Integer> ids)
throws BiobankSessionException {
if (ids.isEmpty()) {
return;
}
String paramString = getParamString(ids.size());
String hql = MessageFormat.format(UPDATE_CHILDREN_HQL, paramString);
Query query = session.createQuery(hql);
query.setParameter(0, topSpecimen);
int position = 1;
for (Integer id : ids) {
query.setParameter(position++, id);
}
query.executeUpdate();
List<Integer> childIds = selectChildren(session, ids);
updateChildren(session, childIds);
}
private List<Integer> selectChildren(Session session, List<Integer> ids) {
String paramString = getParamString(ids.size());
String hql = MessageFormat.format(SELECT_CHILDREN_HQL, paramString);
Query query = session.createQuery(hql);
int position = 0;
for (Integer id : ids) {
query.setParameter(position++, id);
}
@SuppressWarnings("unchecked")
List<Integer> childIds = query.list();
return childIds;
}
private static String getParamString(int numParams) {
StringBuilder buffer = new StringBuilder(numParams * 2);
for (int i = 0; i < numParams; i++) {
buffer.append("?"); //$NON-NLS-1$
if (i < numParams - 1) {
buffer.append(", "); //$NON-NLS-1$
}
}
return buffer.toString();
}
}