package edu.ualberta.med.biobank.common.wrappers; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hibernate.criterion.DetachedCriteria; import edu.ualberta.med.biobank.common.exception.BiobankException; import edu.ualberta.med.biobank.common.exception.BiobankQueryResultSizeException; import edu.ualberta.med.biobank.common.formatters.DateFormatter; import edu.ualberta.med.biobank.common.peer.CenterPeer; import edu.ualberta.med.biobank.common.peer.CollectionEventPeer; import edu.ualberta.med.biobank.common.peer.PatientPeer; import edu.ualberta.med.biobank.common.peer.ProcessingEventPeer; import edu.ualberta.med.biobank.common.peer.SpecimenPeer; import edu.ualberta.med.biobank.common.wrappers.WrapperTransaction.TaskList; import edu.ualberta.med.biobank.common.wrappers.base.ProcessingEventBaseWrapper; import edu.ualberta.med.biobank.common.wrappers.loggers.ProcessingEventLogProvider; import edu.ualberta.med.biobank.model.CollectionEvent; import edu.ualberta.med.biobank.model.ProcessingEvent; import edu.ualberta.med.biobank.model.Specimen; import edu.ualberta.med.biobank.server.applicationservice.BiobankApplicationService; import gov.nih.nci.system.applicationservice.ApplicationException; import gov.nih.nci.system.applicationservice.WritableApplicationService; import gov.nih.nci.system.query.hibernate.HQLCriteria; public class ProcessingEventWrapper extends ProcessingEventBaseWrapper { private static final ProcessingEventLogProvider LOG_PROVIDER = new ProcessingEventLogProvider(); private static final String HAS_DERIVED_SPECIMENS_MSG = Messages .getString("ProcessingEventWrapper.has.derived.specimens.msg"); //$NON-NLS-1$ private Set<SpecimenWrapper> removedSpecimens = new HashSet<SpecimenWrapper>(); public ProcessingEventWrapper(WritableApplicationService appService, ProcessingEvent wrappedObject) { super(appService, wrappedObject); } public ProcessingEventWrapper(WritableApplicationService appService) { super(appService); } public long getSpecimenCount(boolean fast) throws BiobankException, ApplicationException { return getPropertyCount(ProcessingEventPeer.SPECIMENS, fast); } public List<SpecimenWrapper> getDerivedSpecimenCollection(boolean sort) { List<SpecimenWrapper> derivedSpecimens = new ArrayList<SpecimenWrapper>(); for (SpecimenWrapper spec : getSpecimenCollection(false)) { derivedSpecimens.addAll(spec.getChildSpecimenCollection(false)); } if (sort) { Collections.sort(derivedSpecimens); } return derivedSpecimens; } @Override public int compareTo(ModelWrapper<ProcessingEvent> wrapper) { if (wrapper instanceof ProcessingEventWrapper) { Date v1Date = getCreatedAt(); Date v2Date = ((ProcessingEventWrapper) wrapper).getCreatedAt(); if (v1Date != null && v2Date != null) { return v1Date.compareTo(v2Date); } } return 0; } @Override public void resetInternalFields() { removedSpecimens.clear(); } @Override public String toString() { return "Date created:" + getFormattedCreatedAt() + " - Worksheet:" //$NON-NLS-1$ //$NON-NLS-2$ + getWorksheet(); } public String getFormattedCreatedAt() { return DateFormatter.formatAsDateTime(getCreatedAt()); } @Override public ProcessingEventLogProvider getLogProvider() { return LOG_PROVIDER; } private static final String PROCESSING_EVENT_BY_DATE_QRY = "select pEvent from " //$NON-NLS-1$ + ProcessingEvent.class.getName() + " pEvent where pEvent." //$NON-NLS-1$ + ProcessingEventPeer.CREATED_AT.getName() + ">=? and pEvent." //$NON-NLS-1$ + ProcessingEventPeer.CREATED_AT.getName() + "<? and pEvent." //$NON-NLS-1$ + Property.concatNames(ProcessingEventPeer.CENTER, CenterPeer.ID) + "= ?"; //$NON-NLS-1$ public static List<ProcessingEventWrapper> getProcessingEventsWithDateForCenter( WritableApplicationService appService, Date date, CenterWrapper<?> center) throws Exception { HQLCriteria c = new HQLCriteria(PROCESSING_EVENT_BY_DATE_QRY, Arrays.asList(new Object[] { startOfDay(date), endOfDay(date), center.getId() })); List<ProcessingEvent> pvs = appService.query(c); List<ProcessingEventWrapper> pvws = new ArrayList<ProcessingEventWrapper>(); for (ProcessingEvent pv : pvs) pvws.add(new ProcessingEventWrapper(appService, pv)); if (pvws.size() == 0) return new ArrayList<ProcessingEventWrapper>(); return pvws; } private static final String PROCESSING_EVENT_BY_WORKSHEET_QRY = "select pEvent from " //$NON-NLS-1$ + ProcessingEvent.class.getName() + " pEvent where pEvent." //$NON-NLS-1$ + ProcessingEventPeer.WORKSHEET.getName() + "=?"; //$NON-NLS-1$ public static List<ProcessingEventWrapper> getProcessingEventsWithWorksheet( WritableApplicationService appService, String worksheetNumber) throws Exception { HQLCriteria c = new HQLCriteria(PROCESSING_EVENT_BY_WORKSHEET_QRY, Arrays.asList(new Object[] { worksheetNumber })); List<ProcessingEvent> pvs = appService.query(c); List<ProcessingEventWrapper> pvws = new ArrayList<ProcessingEventWrapper>(); for (ProcessingEvent pv : pvs) pvws.add(new ProcessingEventWrapper(appService, pv)); if (pvws.size() == 0) return new ArrayList<ProcessingEventWrapper>(); return pvws; } private static final String PROCESSING_EVENT_BY_WORKSHEET_COUNT_QRY = "select count(pEvent) from " //$NON-NLS-1$ + ProcessingEvent.class.getName() + " pEvent where pEvent." //$NON-NLS-1$ + ProcessingEventPeer.WORKSHEET.getName() + "=?"; //$NON-NLS-1$ public static long getProcessingEventsWithWorksheetCount( WritableApplicationService appService, String worksheetNumber) throws BiobankQueryResultSizeException, ApplicationException { HQLCriteria c = new HQLCriteria( PROCESSING_EVENT_BY_WORKSHEET_COUNT_QRY, Arrays.asList(new Object[] { worksheetNumber })); return getCountResult(appService, c); } public static Collection<? extends ModelWrapper<?>> getAllProcessingEvents( BiobankApplicationService appService) throws ApplicationException { return ModelWrapper.wrapModelCollection(appService, appService.query(DetachedCriteria.forClass(ProcessingEvent.class)), ProcessingEventWrapper.class); } @Deprecated @SuppressWarnings("unchecked") @Override public List<? extends CenterWrapper<?>> getSecuritySpecificCenters() { if (getCenter() != null) return Arrays.asList(getCenter()); return super.getSecuritySpecificCenters(); } public Long getChildSpecimenCount() { List<SpecimenWrapper> parents = getSpecimenCollection(false); Long count = Long.valueOf(0); for (SpecimenWrapper sp : parents) count += sp.getChildSpecimenCollection(false).size(); return count; } private static String CEVENT_FROM_SPECIMEN_AND_PATIENT_QRY = "select distinct(cEvent) from " //$NON-NLS-1$ + CollectionEvent.class.getName() + " as cEvent join cEvent." //$NON-NLS-1$ + CollectionEventPeer.ALL_SPECIMENS.getName() + " as specs where cEvent." //$NON-NLS-1$ + Property.concatNames(CollectionEventPeer.PATIENT, PatientPeer.ID) + "=? and specs." //$NON-NLS-1$ + Property.concatNames(SpecimenPeer.PROCESSING_EVENT, ProcessingEventPeer.ID) + "=?"; //$NON-NLS-1$ public List<CollectionEventWrapper> getCollectionEventFromSpecimensAndPatient( PatientWrapper patient) throws ApplicationException { HQLCriteria c = new HQLCriteria(CEVENT_FROM_SPECIMEN_AND_PATIENT_QRY, Arrays.asList(new Object[] { patient.getId(), getId() })); List<CollectionEvent> res = appService.query(c); return wrapModelCollection(appService, res, CollectionEventWrapper.class); } @Deprecated @Override protected void addPersistTasks(TaskList tasks) { tasks.add(check().notNull(ProcessingEventPeer.WORKSHEET)); tasks.add(check().unique(ProcessingEventPeer.WORKSHEET)); super.addPersistTasks(tasks); tasks.persistAdded(this, ProcessingEventPeer.SPECIMENS); } @Deprecated @Override protected void addDeleteTasks(TaskList tasks) { tasks.persistRemoved(this, ProcessingEventPeer.SPECIMENS); String hasDerivedSpecimensMsg = MessageFormat.format( HAS_DERIVED_SPECIMENS_MSG, getWorksheet(), getFormattedCreatedAt()); tasks.add(check().notUsedBy(Specimen.class, SpecimenPeer.PARENT_SPECIMEN.to(SpecimenPeer.PROCESSING_EVENT), hasDerivedSpecimensMsg)); tasks.add(check().notUsedBy(Specimen.class, SpecimenPeer.PROCESSING_EVENT)); super.addDeleteTasks(tasks); } /** * return true if the user can delete this object */ @Override public boolean canDelete(UserWrapper user, CenterWrapper<?> center, StudyWrapper study) { return super.canDelete(user, center, study) && (getCenter() == null || getCenter().equals( user.getCurrentWorkingCenter())); } /** * return true if the user can edit this object */ @Override public boolean canUpdate(UserWrapper user, CenterWrapper<?> center, StudyWrapper study) { return super.canUpdate(user, center, study) && (getCenter() == null || getCenter().equals( user.getCurrentWorkingCenter())); } public static String PE_BY_PATIENT_STRING = "select distinct s." //$NON-NLS-1$ + SpecimenPeer.PROCESSING_EVENT.getName() + " from " //$NON-NLS-1$ + Specimen.class.getName() + " s where s." //$NON-NLS-1$ + Property.concatNames(SpecimenPeer.COLLECTION_EVENT, CollectionEventPeer.PATIENT, PatientPeer.PNUMBER) + " = ? order by s." //$NON-NLS-1$ + Property.concatNames(SpecimenPeer.PROCESSING_EVENT, ProcessingEventPeer.CREATED_AT); public static List<ProcessingEventWrapper> getProcessingEventsByPatient( BiobankApplicationService appService, String pnum) throws ApplicationException { HQLCriteria c = new HQLCriteria(PE_BY_PATIENT_STRING, Arrays.asList(pnum)); List<ProcessingEvent> res = appService.query(c); return wrapModelCollection(appService, res, ProcessingEventWrapper.class); } /** * Should be addToSpecimenCollection most of the time. But can use this * method from tome to tome to reset the collection (used in saving pEvent * when want to try to re-add the specimens) */ public void setSpecimenWrapperCollection(List<SpecimenWrapper> specs) { setWrapperCollection(ProcessingEventPeer.SPECIMENS, specs); } }