package edu.ualberta.med.biobank.common.wrappers; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import edu.ualberta.med.biobank.common.peer.RequestPeer; import edu.ualberta.med.biobank.common.util.RequestSpecimenState; import edu.ualberta.med.biobank.common.wrappers.base.RequestBaseWrapper; import edu.ualberta.med.biobank.model.Request; import gov.nih.nci.system.applicationservice.ApplicationException; import gov.nih.nci.system.applicationservice.WritableApplicationService; import gov.nih.nci.system.query.hibernate.HQLCriteria; public class RequestWrapper extends RequestBaseWrapper { private static final String NON_PROCESSED_SPECIMENS_CACHE_KEY = "nonProcessedRequestSpecimenCollection"; //$NON-NLS-1$ private static final String PROCESSED_SPECIMENS_CACHE_KEY = "processedRequestSpecimens"; //$NON-NLS-1$ private static final String UNAVAILABLE_SPECIMENS_KEY = "unavailableRequestSpecimens"; //$NON-NLS-1$ public RequestWrapper(WritableApplicationService appService) { super(appService); } public RequestWrapper(WritableApplicationService appService, Request request) { super(appService, request); } public void receiveSpecimens(List<SpecimenWrapper> specimens) throws Exception { List<RequestSpecimenWrapper> flagged = new ArrayList<RequestSpecimenWrapper>(); List<RequestSpecimenWrapper> ras = getNonProcessedRequestSpecimenCollection(); for (RequestSpecimenWrapper r : ras) for (SpecimenWrapper a : specimens) if (r.getSpecimen().getInventoryId().equals(a.getInventoryId())) { flagged.add(r); } flagSpecimens(flagged); } @Deprecated public void flagSpecimens(List<RequestSpecimenWrapper> scanned) throws Exception { for (RequestSpecimenWrapper a : scanned) { a.setState(RequestSpecimenState.PULLED_STATE.getId()); a.persist(); } cache.put(NON_PROCESSED_SPECIMENS_CACHE_KEY, null); cache.put(PROCESSED_SPECIMENS_CACHE_KEY, null); } public List<RequestSpecimenWrapper> getNonProcessedRequestSpecimenCollection() { return getRequestSpecimenCollectionWithState( NON_PROCESSED_SPECIMENS_CACHE_KEY, true, RequestSpecimenState.AVAILABLE_STATE); } public List<RequestSpecimenWrapper> getProcessedRequestSpecimenCollection() { return getRequestSpecimenCollectionWithState( PROCESSED_SPECIMENS_CACHE_KEY, true, RequestSpecimenState.PULLED_STATE); } @SuppressWarnings("unchecked") private List<RequestSpecimenWrapper> getRequestSpecimenCollectionWithState( String mapKey, boolean sort, RequestSpecimenState... states) { List<RequestSpecimenWrapper> dsaCollection = (List<RequestSpecimenWrapper>) cache .get(mapKey); if (dsaCollection == null) { Collection<RequestSpecimenWrapper> children = getRequestSpecimenCollection(sort); if (children != null) { dsaCollection = new ArrayList<RequestSpecimenWrapper>(); for (RequestSpecimenWrapper dsa : children) { boolean hasState = false; for (RequestSpecimenState state : states) { if (state.getId().equals(dsa.getState())) { hasState = true; break; } } if (hasState) dsaCollection.add(dsa); } cache.put(mapKey, dsaCollection); } if ((dsaCollection != null) && sort) Collections.sort(dsaCollection); } return dsaCollection; } public List<RequestSpecimenWrapper> getUnavailableRequestSpecimenCollection() { return getRequestSpecimenCollectionWithState(UNAVAILABLE_SPECIMENS_KEY, true, RequestSpecimenState.UNAVAILABLE_STATE); } public void resetStateLists() { cache.put(UNAVAILABLE_SPECIMENS_KEY, null); cache.put(PROCESSED_SPECIMENS_CACHE_KEY, null); cache.put(NON_PROCESSED_SPECIMENS_CACHE_KEY, null); } public RequestSpecimenWrapper getRequestSpecimen(String inventoryId) { for (RequestSpecimenWrapper dsa : getRequestSpecimenCollection(false)) { if (dsa.getSpecimen().getInventoryId().equals(inventoryId)) return dsa; } return null; } private static final String REQUEST_BY_NUMBER_QRY = "from " //$NON-NLS-1$ + Request.class.getName() + " where " + RequestPeer.ID.getName() + "=?"; //$NON-NLS-1$ //$NON-NLS-2$ public static List<RequestWrapper> getRequestByNumber( WritableApplicationService appService, Integer requestNumber) throws ApplicationException { HQLCriteria criteria = new HQLCriteria(REQUEST_BY_NUMBER_QRY, Arrays.asList(new Object[] { requestNumber })); List<Request> shipments = appService.query(criteria); List<RequestWrapper> wrappers = new ArrayList<RequestWrapper>(); for (Request s : shipments) { wrappers.add(new RequestWrapper(appService, s)); } return wrappers; } }