package edu.ualberta.med.biobank.common.wrappers.actions;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import edu.ualberta.med.biobank.common.peer.ContainerPeer;
import edu.ualberta.med.biobank.common.peer.ContainerPositionPeer;
import edu.ualberta.med.biobank.common.wrappers.ContainerWrapper;
import edu.ualberta.med.biobank.common.wrappers.Property;
import edu.ualberta.med.biobank.model.Container;
import edu.ualberta.med.biobank.server.applicationservice.exceptions.BiobankSessionException;
public class UpdateContainerPathAction extends WrapperAction<Container> {
private static final long serialVersionUID = 1L;
private static final String PATH_DELIMITER = ContainerWrapper.PATH_DELIMITER;
private static final Property<Container, Container> PARENT_PROPERTY = ContainerPeer.POSITION
.to(ContainerPositionPeer.PARENT_CONTAINER);
private static final Property<String, Container> PARENT_PATH_PROPERTY = PARENT_PROPERTY
.to(ContainerPeer.PATH);
private static final Property<Integer, Container> PARENT_ID_PROPERTY = PARENT_PROPERTY
.to(ContainerPeer.ID);
// @formatter:off
@SuppressWarnings("nls")
private static final String SELECT_PARENT_INFO_HQL =
"SELECT o." + PARENT_PATH_PROPERTY.getName() +
" ,o." + PARENT_ID_PROPERTY.getName() +
" FROM " + Container.class.getName() + " o" +
" WHERE o = ?";
// @formatter:on
public UpdateContainerPathAction(ContainerWrapper wrapper) {
super(wrapper);
}
@Override
public Object doAction(Session session) throws BiobankSessionException {
String path = getPath(session);
Container container = getModel();
ContainerPeer.PATH.set(container, path);
session.update(container);
return null;
}
private String getPath(Session session) {
Query query = session.createQuery(SELECT_PARENT_INFO_HQL);
query.setParameter(0, getModel());
@SuppressWarnings("unchecked")
List<Object[]> results = query.list();
StringBuilder path = new StringBuilder();
for (Object[] result : results) {
String parentPath = (String) result[0];
Integer parentId = (Integer) result[1];
if (parentPath != null && !parentPath.isEmpty()) {
path.append(parentPath);
path.append(PATH_DELIMITER);
}
if (parentId != null) {
path.append(parentId);
}
break;
}
return path.toString();
}
}