package edu.ualberta.med.biobank.forms.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.common.action.request.RequestGetSpecimenInfosAction;
import edu.ualberta.med.biobank.common.util.ItemState;
import edu.ualberta.med.biobank.common.util.RequestSpecimenState;
import edu.ualberta.med.biobank.common.wrappers.ContainerWrapper;
import edu.ualberta.med.biobank.common.wrappers.RequestSpecimenWrapper;
import edu.ualberta.med.biobank.common.wrappers.RequestWrapper;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
import edu.ualberta.med.biobank.model.Container;
import edu.ualberta.med.biobank.model.RequestSpecimen;
import edu.ualberta.med.biobank.treeview.Node;
import edu.ualberta.med.biobank.treeview.TreeItemAdapter;
import edu.ualberta.med.biobank.treeview.request.RequestContainerAdapter;
public class RequestTableGroup extends TableGroup<RequestWrapper> {
public RequestTableGroup(RequestSpecimenState ds, String alternateLabel,
RequestWrapper request) {
super(ds, alternateLabel, request);
}
public RequestTableGroup(RequestSpecimenState ds, RequestWrapper request) {
super(ds, request);
}
public static List<RequestTableGroup> getGroupsForRequest(
RequestWrapper ship) {
ArrayList<RequestTableGroup> groups =
new ArrayList<RequestTableGroup>();
groups.add(new RequestTableGroup(null,
Messages.RequestTableGroup_0, ship));
groups.add(new RequestTableGroup(RequestSpecimenState.PULLED_STATE,
ship));
return groups;
}
@Override
public void createAdapterTree(ItemState state, RequestWrapper request)
throws Exception {
List<Object[]> results = new ArrayList<Object[]>();
RequestGetSpecimenInfosAction specAction =
new RequestGetSpecimenInfosAction(request.getId());
try {
results =
SessionManager.getAppService().doAction(specAction).getList();
} catch (Exception e) {
BgcPlugin.openAsyncError(Messages.RequestTableGroup_1,
Messages.RequestTableGroup_2, e);
}
HashSet<Integer> containers = new HashSet<Integer>();
HashMap<Integer, RequestContainerAdapter> adapters =
new HashMap<Integer, RequestContainerAdapter>();
this.tops = new ArrayList<Node>();
if (state == null) {
// construct tree
for (Object o : results) {
String path = (String) ((Object[]) o)[1];
RequestSpecimen ra = (RequestSpecimen) ((Object[]) o)[0];
String[] cIds = p.split(path);
int i = 0;
for (; i < cIds.length; i++) {
Integer id = Integer.parseInt(cIds[i]);
containers.add(id);
RequestContainerAdapter adapter = null;
if (!adapters.containsKey(id)) {
// add adapter
DetachedCriteria c = DetachedCriteria
.forClass(Container.class)
.add(Restrictions.idEq(id));
ContainerWrapper cw = new ContainerWrapper(
SessionManager.getAppService(),
(Container) SessionManager.getAppService()
.query(c).get(0));
adapter = new RequestContainerAdapter(this, cw);
if (i == 0)
tops.add(adapter);
else {
RequestContainerAdapter parent = adapters
.get(Integer.parseInt(cIds[i - 1]));
parent.addChild(adapter);
adapter.setParent(parent);
}
adapters.put(id, adapter);
}
}
adapters.get(Integer.parseInt(cIds[i - 1])).addChild(
new TreeItemAdapter(adapters.get(Integer
.parseInt(cIds[i - 1])), new RequestSpecimenWrapper(
SessionManager.getAppService(), ra)));
numSpecimens++;
}
} else {
for (Object o : results) {
RequestSpecimen ra = (RequestSpecimen) ((Object[]) o)[0];
if (RequestSpecimenState.getState(ra.getState()).equals(state)) {
tops.add(new TreeItemAdapter(null,
new RequestSpecimenWrapper(SessionManager
.getAppService(), ra)));
numSpecimens++;
}
}
}
}
public void addChild(Node c) {
tops.add(c);
numSpecimens++;
}
@Override
public void removeChild(Node o) {
tops.remove(o);
numSpecimens--;
}
}