From 5fcf6b51a5f539bb4f29656c97634a4d49d0ccf8 Mon Sep 17 00:00:00 2001 From: kohleman <kohleman> Date: Wed, 22 May 2013 14:47:45 +0000 Subject: [PATCH] New Tracking client to reflect the new structure of the Meta Data Model SVN: 29200 --- .../email/EntityTrackingEmailDataManager.java | 131 ++++++++++++---- .../email/EntityTrackingEmailGenerator.java | 110 ++++++++++---- .../cisd/dsu/tracking/main/TrackingBO.java | 140 +++++++++++++++--- .../dsu/tracking/main/TrackingClient.java | 11 +- .../tracking/etc/openBIS.keystore | Bin 0 -> 83353 bytes .../bo/samplelister/ISampleListingQuery.java | 41 +++-- .../bo/samplelister/SampleListingWorker.java | 35 +++-- 7 files changed, 361 insertions(+), 107 deletions(-) create mode 100644 deep_sequencing_unit/tracking/etc/openBIS.keystore diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java index 2cca9c040d3..2b83c189661 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java @@ -27,6 +27,7 @@ import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; /** * Manager that groups data about tracked entities into {@link EntityTrackingEmailData} objects. @@ -41,6 +42,8 @@ class EntityTrackingEmailDataManager private final static String PRINCIPAL_INVESTIGATOR_EMAIL = "PRINCIPAL_INVESTIGATOR_EMAIL"; + private final static String MASTER_SAMPLE_TYPE = "MASTER_SAMPLE"; + private static Map<String, String> recipientsByAffiliation; public static void initialize(final Map<String, String> recipients) @@ -121,8 +124,7 @@ class EntityTrackingEmailDataManager } /** - * Returns a set of emails of recipients that should get a tracking information about given - * <var>sequencingSample</var>.<br> + * Returns a set of emails of recipients that should get a tracking information about given <var>sequencingSample</var>.<br> */ // NOTE: Set is needed because one recipient can occur in many roles for one sample private static Set<String> getSequencingSampleTrackingRecipients( @@ -137,56 +139,125 @@ class EntityTrackingEmailDataManager recipientPropertyTypeCodes.add(CONTACT_PERSON_EMAIL); recipientPropertyTypeCodes.add(PRINCIPAL_INVESTIGATOR_EMAIL); + SampleType masterSampleType = new SampleType(); + masterSampleType.setCode(MASTER_SAMPLE_TYPE); + for (Sample sequencingSample : sequencingSamples) { - for (IEntityProperty property : sequencingSample.getProperties()) + + findMasterSample(sequencingSample, recipients); + + // SampleType seqSampleSampleType = sequencingSample.getSampleType(); + // if (seqSampleSampleType.equals(masterSampleType)) + // { + // Set<String> r = extractProperties(recipientPropertyTypeCodes, sequencingSample); + // recipients.addAll(r); + // } + // else + // { + // Set<Sample> parents = sequencingSample.getParents(); + // assert parents != null; + // for (Sample parent : parents) + // { + // SampleType sampleType = parent.getSampleType(); + // + // if (false == sampleType.equals(masterSampleType)) + // { + // Set<Sample> grandParents = parent.getParents(); + // for (Sample grandparent : grandParents) + // { + // Set<String> r = extractProperties(recipientPropertyTypeCodes, grandparent); + // recipients.addAll(r); + // } + // } + // else + // { + // { + // Set<String> r = extractProperties(recipientPropertyTypeCodes, sequencingSample); + // recipients.addAll(r); + // } + // } + // + // } + // + // } + } + return recipients; + } + + private static void findMasterSample(Sample s, Set<String> recipients) + { + SampleType masterSampleType = new SampleType(); + masterSampleType.setCode(MASTER_SAMPLE_TYPE); + // Recipients are taken from properties of the sequencing sample. + final Set<String> recipientPropertyTypeCodes = new HashSet<String>(); + recipientPropertyTypeCodes.add(CONTACT_PERSON_EMAIL); + recipientPropertyTypeCodes.add(PRINCIPAL_INVESTIGATOR_EMAIL); + + SampleType seqSampleSampleType = s.getSampleType(); + if (seqSampleSampleType.equals(masterSampleType)) + { + Set<String> r = extractProperties(recipientPropertyTypeCodes, s); + recipients.addAll(r); + } + else + { + for (Sample parent : s.getParents()) { - final String propertyCode = property.getPropertyType().getCode(); - final String propertyValue = property.tryGetAsString(); - if (recipientPropertyTypeCodes.contains(propertyCode)) - { - recipients.add(propertyValue); - } else + findMasterSample(parent, recipients); + + } + } + + } + + private static Set<String> extractProperties(final Set<String> recipientPropertyTypeCodes, Sample sequencingSample) + { + Set<String> recipients = new HashSet<String>(); + for (IEntityProperty property : sequencingSample.getProperties()) + { + final String propertyCode = property.getPropertyType().getCode(); + final String propertyValue = property.tryGetAsString(); + if (recipientPropertyTypeCodes.contains(propertyCode)) + { + recipients.add(propertyValue); + } else + { + // add recipient for affiliation if his email was specified in properties + if (propertyCode.equals(AFFILIATION)) { - // add recipient for affiliation if his email was specified in properties - if (propertyCode.equals(AFFILIATION)) + String affiliationRecipientOrNull = + recipientsByAffiliation.get(propertyValue); + if (affiliationRecipientOrNull != null) { - String affiliationRecipientOrNull = - recipientsByAffiliation.get(propertyValue); - if (affiliationRecipientOrNull != null) - { - recipients.add(affiliationRecipientOrNull); - } + recipients.add(affiliationRecipientOrNull); } } } } - return recipients; } /** - * Returns a set of emails of recipients that should get a tracking information about given - * <var>flowLaneSample</var>. + * Returns a set of emails of recipients that should get a tracking information about given <var>flowLaneSample</var>. */ - private static Set<String> getFlowLaneSampleTrackingRecipients(Sample flowLaneSample) + private static Set<String> getSampleTrackingRecipients(Sample sample) { - // Recipients are taken from properties of sequencing sample - // that is a parent of the flow lane sample. - assert flowLaneSample != null; - return getSequencingSampleTrackingRecipients(flowLaneSample.getParents()); + // Recipients are taken from properties of master sample + // that is a parent/grandparent of a library/raw sample + assert sample != null; + return getSequencingSampleTrackingRecipients(sample.getParents()); } /** - * Returns a set of emails of recipients that should get a tracking information about given - * <var>dataSet</var>. + * Returns a set of emails of recipients that should get a tracking information about given <var>dataSet</var>. */ private static Set<String> getDataSetTrackingRecipients(AbstractExternalData dataSet) { - // Recipients are taken from properties of sequencing sample - // that is a parent of a flow lane sample connected directly with the data set. + // Recipients are taken from properties of master sample + // that is a parent/grandparent of a library/raw sample connected with the data set. assert dataSet != null; - return getFlowLaneSampleTrackingRecipients(dataSet.getSample()); + return getSampleTrackingRecipients(dataSet.getSample()); } } \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java index e944be35a9e..c17eb0b22d6 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; +import java.util.Set; import java.util.TreeMap; import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; @@ -163,11 +164,11 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat private static final String PERMLINK_LABEL = "See details in openBIS"; - private static final String GENARATED_CONTENT_TARGET = "{generated-content}"; + private static final String GENERATED_CONTENT_TARGET = "{generated-content}"; public static String fillTemplateWithData(String template, EntityTrackingEmailData emailData) { - return template.replace(GENARATED_CONTENT_TARGET, generateContent(emailData)); + return template.replace(GENERATED_CONTENT_TARGET, generateContent(emailData)); } private static String generateContent(EntityTrackingEmailData emailData) @@ -179,12 +180,33 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat return sb.toString(); } + private static String getName(Sample sequencingSample) + { + /** + * We try to get the external sample name recursively in the sample tree. This means we take the first name in the tree. This results in + * the following precedence: LIBARY -> RAW + */ + + String externalSampleName = getExternalSampleName(sequencingSample); + if (externalSampleName == null || externalSampleName.isEmpty()) + { + Set<Sample> parents = sequencingSample.getParents(); + for (Sample parent : parents) + { + externalSampleName = getName(parent); + } + } + + return externalSampleName; + + } + private static void appendSequencingSamplesData(StringBuilder sb, Collection<Sample> sequencingSamples, boolean processed) { for (Sample sequencingSample : sequencingSamples) { - final String externalSampleName = getExternalSampleName(sequencingSample); + String externalSampleName = getName(sequencingSample); appendln(sb, SECTION_SEPARATOR_LINE); appendln(sb, SUBSECTION_SEPARATOR_LINE); @@ -229,18 +251,19 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat appendln(sb, SUBSECTION_SEPARATOR_LINE); appendln(sb, "There are new sequencing results available to you."); appendln(sb, SUBSECTION_SEPARATOR_LINE); - + // Using a TreeMap, so the keys are sorted TreeMap<String, List<AbstractExternalData>> sampleMap = new TreeMap<String, List<AbstractExternalData>>(); - List <AbstractExternalData> dsList = new ArrayList<AbstractExternalData>(); - + List<AbstractExternalData> dsList = new ArrayList<AbstractExternalData>(); + // we just loop over the data sets and write the connected samples as keys - // and the data sets as values in a map, so that we can group together as + // and the data sets as values in a map, so that we can group together as // data sets per lane for (AbstractExternalData dataSet : dataSets) { Sample s = dataSet.getSample(); - if (sampleMap.containsKey(s.getIdentifier())) { + if (sampleMap.containsKey(s.getIdentifier())) + { dsList = sampleMap.get(s.getIdentifier()); } dsList.add(dataSet); @@ -250,11 +273,13 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat // now we can write out this per sample Iterator<Entry<String, List<AbstractExternalData>>> it = sampleMap.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry pairs = (Map.Entry)it.next(); + while (it.hasNext()) + { + Map.Entry pairs = (Map.Entry) it.next(); appendln(sb, String.format("Results for %s", pairs.getKey())); dsList = (List<AbstractExternalData>) pairs.getValue(); - for (AbstractExternalData ed : dsList) { + for (AbstractExternalData ed : dsList) + { appendDataSetDetails(sb, ed); } it.remove(); // avoids a ConcurrentModificationException @@ -270,23 +295,27 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat assert flowLaneSample != null; sequencingSamples = flowLaneSample.getParents(); assert sequencingSamples != null; - + String Index1 = getIndex1(dataSet); String Index2 = getIndex2(dataSet); String Index = null; - if (Index1 != null) { + if (Index1 != null) + { Index = Index1; } - if (Index2 != null) { + if (Index2 != null) + { Index = Index + "-" + Index2; } - if (Index != null) { + if (Index != null) + { appendln(sb, "Data Set Type: " + dataSet.getDataSetType().toString() + " Index: " + Index); } - else { + else + { appendln(sb, "Data Set Type: " + dataSet.getDataSetType().toString()); } appendln(sb, dataSet.getPermlink()); @@ -296,33 +325,45 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat { String externalSampleName = tryGetSamplePropertyValue(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY_CODE); - assert externalSampleName != null; + // assert externalSampleName != null; + if (externalSampleName == null) + { + externalSampleName = ""; + } return externalSampleName; } - - private static String getIndex1(AbstractExternalData dataSet) { + + private static String getIndex1(AbstractExternalData dataSet) + { List<IEntityProperty> properties = dataSet.getProperties(); - - String Index = null; - for (IEntityProperty p : properties) { - if (p.getPropertyType().getCode().equals(INDEX1_PROPERTY_CODE)) { + + String Index = null; + for (IEntityProperty p : properties) + { + if (p.getPropertyType().getCode().equals(INDEX1_PROPERTY_CODE)) + { Index = p.getVocabularyTerm().getCode(); - if (! Index.equals("NOINDEX")) { + if (!Index.equals("NOINDEX")) + { return Index; } } } return null; } - - private static String getIndex2(AbstractExternalData dataSet) { + + private static String getIndex2(AbstractExternalData dataSet) + { List<IEntityProperty> properties = dataSet.getProperties(); - - String Index = null; - for (IEntityProperty p : properties) { - if (p.getPropertyType().getCode().equals(INDEX2_PROPERTY_CODE)) { + + String Index = null; + for (IEntityProperty p : properties) + { + if (p.getPropertyType().getCode().equals(INDEX2_PROPERTY_CODE)) + { Index = p.getVocabularyTerm().getCode(); - if (! Index.equals("NOINDEX")) { + if (!Index.equals("NOINDEX")) + { return Index; } } @@ -330,7 +371,6 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat return null; } - private static String tryGetSamplePropertyValue(Sample sequencingSample, String propertyCode) { String result = null; @@ -386,4 +426,10 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat } + public static void findSampleWithExternalSampleName(Sample sequencingSample) + { + // TODO Auto-generated method stub + + } + } diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java index 2c1fdfdcbf3..888cf720ab9 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java @@ -16,7 +16,11 @@ package ch.ethz.bsse.cisd.dsu.tracking.main; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -30,9 +34,19 @@ import ch.systemsx.cisd.common.collection.CollectionUtils; import ch.systemsx.cisd.common.mail.From; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleFetchOption; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.SearchOperator; import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria; import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; @@ -42,27 +56,40 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; */ public class TrackingBO { - private static final String SEQUENCING_SAMPLE_TYPE = "ILLUMINA_SEQUENCING"; + private static final String EXTERNAL_SAMPLE_NAME = "EXTERNAL_SAMPLE_NAME"; - private static final String FLOW_LANE_SAMPLE_TYPE = "ILLUMINA_FLOW_LANE"; + private static final String LIBRARY_SAMPLE_TYPE = "LIBRARY"; - private static final String PROCESSING_POSSIBLE_PROPERTY_CODE = "LIBRARY_PROCESSING_POSSIBLE"; + private static final String RAW_SAMPLE_TYPE = "RAW_SAMPLE"; + + private static final String DATASET_ATTACHED_TO_SAMPLE_TYPE = "LIBRARY"; + + private static final String PROCESSING_POSSIBLE_PROPERTY_CODE = "LIBRARY_PROCESSING_POSSIBLE_YES_NO"; private static final String PROCESSING_SUCCESSFUL_PROPERTY_CODE = "LIBRARY_PROCESSING_SUCCESSFUL"; + private final static String CONTACT_PERSON_EMAIL = "CONTACT_PERSON_EMAIL"; + + private final static String PRINCIPAL_INVESTIGATOR_EMAIL = "PRINCIPAL_INVESTIGATOR_EMAIL"; + private static final String TRUE = "true"; + private static final String YES = "YES"; + private final ITrackingServer trackingServer; + private final IGeneralInformationService gis; + private final IEntityTrackingEmailGenerator emailGenerator; private final IMailClient mailClient; - public TrackingBO(ITrackingServer trackingServer, IEntityTrackingEmailGenerator emailGenerator, + public TrackingBO(ITrackingServer trackingServer, IGeneralInformationService gis, IEntityTrackingEmailGenerator emailGenerator, IMailClient mailClient) { this.trackingServer = trackingServer; + this.gis = gis; this.emailGenerator = emailGenerator; this.mailClient = mailClient; } @@ -72,7 +99,7 @@ public class TrackingBO TrackingStateDTO prevTrackingState = trackingDAO.getTrackingState(); TrackedEntities changedEntities = - fetchChangedEntities(prevTrackingState, trackingServer, session); + fetchChangedEntities(prevTrackingState, trackingServer, gis, session); List<EmailWithSummary> emailsWithSummary = emailGenerator.generateEmails(changedEntities); sendEmails(emailsWithSummary, mailClient); saveTrackingState(prevTrackingState, changedEntities, trackingDAO); @@ -163,17 +190,18 @@ public class TrackingBO } private static TrackedEntities fetchChangedEntities(TrackingStateDTO trackingState, - ITrackingServer trackingServer, SessionContextDTO session) + ITrackingServer trackingServer, IGeneralInformationService gis, SessionContextDTO session) { List<Sample> sequencingSamplesToBeProcessed = - listSequencingSamples(PROCESSING_POSSIBLE_PROPERTY_CODE, trackingState - .getAlreadyTrackedSampleIdsToBeProcessed(), trackingServer, session); + listSequencingSamples(RAW_SAMPLE_TYPE, YES, PROCESSING_POSSIBLE_PROPERTY_CODE, trackingState + .getAlreadyTrackedSampleIdsToBeProcessed(), trackingServer, gis, session); + List<Sample> sequencingSamplesSuccessfullyProcessed = - listSequencingSamples(PROCESSING_SUCCESSFUL_PROPERTY_CODE, trackingState - .getAlreadyTrackedSampleIdsProcessed(), trackingServer, session); + listSequencingSamples(LIBRARY_SAMPLE_TYPE, TRUE, PROCESSING_SUCCESSFUL_PROPERTY_CODE, trackingState + .getAlreadyTrackedSampleIdsProcessed(), trackingServer, gis, session); TrackingDataSetCriteria dataSetCriteria = - new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, trackingState + new TrackingDataSetCriteria(DATASET_ATTACHED_TO_SAMPLE_TYPE, trackingState .getLastSeenDatasetId()); List<AbstractExternalData> dataSets = trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); @@ -182,22 +210,100 @@ public class TrackingBO sequencingSamplesSuccessfullyProcessed, dataSets); } - private static List<Sample> listSequencingSamples(String propertyTypeCode, - Set<Long> alreadyTrackedSampleIds, ITrackingServer trackingServer, + private static List<Sample> listSequencingSamples(String SampleType, String propertyValue, String propertyTypeCode, + Set<Long> alreadyTrackedSampleIds, ITrackingServer trackingServer, IGeneralInformationService gis, SessionContextDTO session) { - return listSamples(SEQUENCING_SAMPLE_TYPE, propertyTypeCode, TRUE, alreadyTrackedSampleIds, - trackingServer, session); + return listSamples(SampleType, propertyTypeCode, propertyValue, alreadyTrackedSampleIds, + trackingServer, gis, session); } private static List<Sample> listSamples(String sampleType, String propertyTypeCode, String propertyValue, Set<Long> alreadyTrackedSampleIds, - ITrackingServer trackingServer, SessionContextDTO session) + ITrackingServer trackingServer, IGeneralInformationService gis, SessionContextDTO session) { TrackingSampleCriteria criteria = new TrackingSampleCriteria(sampleType, propertyTypeCode, propertyValue, alreadyTrackedSampleIds); - return trackingServer.listSamples(session.getSessionToken(), criteria); + List<Sample> samples = trackingServer.listSamples(session.getSessionToken(), criteria); + + for (Sample sample : samples) + { + SearchCriteria parentCriteria = new SearchCriteria(); + parentCriteria.setOperator(SearchOperator.MATCH_ANY_CLAUSES); + + for (Sample parent : sample.getParents()) + { + parentCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, parent.getCode())); + } + + List<ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample> apiParents = + gis.searchForSamples(session.getSessionToken(), parentCriteria, + EnumSet.of(SampleFetchOption.PARENTS, SampleFetchOption.PROPERTIES)); + Set<Sample> dtoParents = new HashSet<Sample>(); + + for (ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample apiParent : apiParents) + { + dtoParents.add(convertSample(apiParent)); + } + sample.setParents(dtoParents); + } + + return samples; + } + + private static Sample convertSample(ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample apiSample) + { + Sample dtoSample = new Sample(); + + EntityProperty person = new EntityProperty(); + EntityProperty pi = new EntityProperty(); + EntityProperty externalSampleName = new EntityProperty(); + + List<IEntityProperty> propertyList = new ArrayList<IEntityProperty>(); + + dtoSample.setCode(apiSample.getCode()); + String sampleTypeCode = apiSample.getSampleTypeCode(); + + SampleType stc = new SampleType(); + stc.setCode(sampleTypeCode); + + dtoSample.setSampleType(stc); + + Map<String, String> properties = apiSample.getProperties(); + + PropertyType personType = new PropertyType(); + PropertyType piType = new PropertyType(); + PropertyType externalSampleNameType = new PropertyType(); + + personType.setCode(CONTACT_PERSON_EMAIL); + piType.setCode(PRINCIPAL_INVESTIGATOR_EMAIL); + externalSampleNameType.setCode(EXTERNAL_SAMPLE_NAME); + + person.setPropertyType(personType); + person.setValue(properties.get(CONTACT_PERSON_EMAIL)); + propertyList.add(person); + + pi.setPropertyType(piType); + pi.setValue(properties.get(PRINCIPAL_INVESTIGATOR_EMAIL)); + propertyList.add(pi); + + externalSampleName.setPropertyType(externalSampleNameType); + externalSampleName.setValue(properties.get(EXTERNAL_SAMPLE_NAME)); + propertyList.add(externalSampleName); + + dtoSample.setProperties(propertyList); + + if (apiSample.getRetrievedFetchOptions().contains(SampleFetchOption.PARENTS)) + { + Set<Sample> dtoParents = new HashSet<Sample>(); + for (ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample apiParent : apiSample.getParents()) + { + dtoParents.add(convertSample(apiParent)); + } + dtoSample.setParents(dtoParents); + } + return dtoSample; } static class TrackingStateUpdateHelper diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java index bdaf5b9c4d5..780ce7375d8 100644 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java +++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java @@ -38,6 +38,7 @@ import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.shared.basic.string.StringUtils; import ch.systemsx.cisd.common.spring.HttpInvokerUtils; import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; /** @@ -74,10 +75,11 @@ public class TrackingClient Parameters params = new Parameters(props); ITrackingServer trackingServer = createOpenBISTrackingServer(params); + IGeneralInformationService gis = createOpenBISGeneralInformationService(params); IEntityTrackingEmailGenerator emailGenerator = new EntityTrackingEmailGenerator(props, retrieveEmailTemplate()); IMailClient mailClient = params.getMailClient(); - TrackingBO trackingBO = new TrackingBO(trackingServer, emailGenerator, mailClient); + TrackingBO trackingBO = new TrackingBO(trackingServer, gis, emailGenerator, mailClient); ITrackingDAO trackingDAO = new FileBasedTrackingDAO(LOCAL_STORAGE_FILE); @@ -93,6 +95,13 @@ public class TrackingClient 5 * DateUtils.MILLIS_PER_MINUTE); } + private static IGeneralInformationService createOpenBISGeneralInformationService(Parameters params) + { + String serviceURL = params.getOpenbisServerURL() + IGeneralInformationService.SERVICE_URL; + return HttpInvokerUtils.createServiceStub(IGeneralInformationService.class, serviceURL, + 5 * DateUtils.MILLIS_PER_MINUTE); + } + private static SessionContextDTO authentificateInOpenBIS(Parameters params, ITrackingServer trackingServer) { diff --git a/deep_sequencing_unit/tracking/etc/openBIS.keystore b/deep_sequencing_unit/tracking/etc/openBIS.keystore new file mode 100644 index 0000000000000000000000000000000000000000..776d15ff5354656cb250ea54cd9134af48feaa93 GIT binary patch literal 83353 zcmdqJ2Urwavo=c3IcEltoMy;DKr%?qIWxeJb5zMmM35{ZIfEcU5CIVhf`}qH3KB&W z1w=C39zaF+KHom)zu!6cp5N!enbqCXYpw28Z&kfjtByY(e?~w+Kmz{MPCv<QVfHW^ zsHeA;mzR$x)D~vz>E`BbV}*c#NUoPLACG`)$Rh|AML<Aq28SUxg2Rw<a*>e`k&p;* zR_2z-#}$qfmMjmczk)@<xM-LhQA$xexQK|Ts0d&v1RIQrhOCEzMvSDV10e+y!y8z{ zIC4ObvOtd@Wmg*rC72w37@L^D&(DwN$6$DD+*}}+z>M%y$i&n?e<6J~NRYA|NE;X? zNLCt5M~({?f<PePvwz0qxcortXY+q*7-5Kv7ass3DgtsCB0d5*3=s<{3=t9G0Uqh= zMcEM3n&_=Y%RLXGqN-_@l$i2wueU*>Y=)LNyCIWhq^W#Xmmk%zMclkOor8rFP9B($ zSb1|LK*tmk!SNkGgHOo!)w`L?rTJeR4;VJJt!8sTWAyVi6UP*`gG444dxjK(EsFhl zLVHfZ!w*Fy+o?Nl@lTBNQXI44*Oi2icDTwtvl2`rJ2uLS^K}{9$XCJTJi+#y%(fi3 zohaDtuNMu<d$Z(%)uVh3lELrHxEejcXPp0pIE?VKDEa-nVxD=+`-KxD<Pe{#$m@(% zQiuvs-`N6sY9<#A$UAS);61EQD%P)Stxf-2Uh=iEt5hnLY~Um>Z4JYM!cPMU84&@o zzy@pu#sgj|Ej}XR2?`3ZkfOl&@HR2LjS5BvKESl_19&K8C?xW0`PJW&`obXGT5%;M z4EMKOdho&Y@Y75v6kxKDzrW!3bqKr$M1*|2mf88wUl%;R0&P>;c0BFI`4(k-tgE8e zHb*Aj>DT4FdQHOCgqv<@N~CJII3y9SEN_@D2%{=h{HWg@P(d_q9~v<mjCna_`7sL@ zs8ynlEq2G^gmFGSf_@eHC3<eQ-CnuQY^@fPV~ypr|I_PIoLh}7f-V-Zhz-gnIf$tD zDkPZOUo`|j-*AiS-nVsF3*}B(lWE+)MK@!;@l?~k(YbYNgWd^82%Rig_*$8XOW+2P zf@Sy^E6P)q*Xd6?>^U3=XG2zS`0d(=aY<aag6VAt==S5OnO&R{iW;pDYX%Eg@(4Wc zKbY^>>$t1c$cc{enrB(Fwqzemo;UyN=BcQYdVBhKdD}o;y`i2q&Vao0*;v6~r-B~8 z;QUk2QL4aUDCK~#C!Gm89*-jeA_5Zqm^K3!p{e-ARSp+(-wR?cCl8?kQvvS>5OZQ( zS&%NgL)p^~L5eQcN)Sdc2!0lunDURavheYM_yB>1FoT)k*B}$q{D;?ol$Foq9t?r- zK?L|k1o#2D=M#kR@k99d1Vsf!jsHIz*FOP4MM(6$+h04bMUQ>B6h>Hgc}CWHeYZn? z^27UFi?<xLACnzs>w89JS37--f)C%*?n2y|sAIBOn}UwS27Aj^Nq7^VB5SuR_kTZH z#IVCQxS21L`*<W6W}3)Xn~wYP>a>C+l3uLN0+n%}P&c~%&aF3u-&C8y?kK56-$id7 zd4*zJk2U9`V=QBoS9xg11AdhQJv!_QE!&tAuP%ss8~d?SK0wo~YL&q|NiEJOEFooK z_3Flo@<Wn^ZR@@f&sO@T!JORw(tX693EbJqL&f`bJ-V~XS2q~Sjw#gFm4+#szg%CO zzu#xl;CiyqZ@l6ihWaFgS)^|fmR&7fP8G3z1_WV<0su6E|0?{yqXXInFj%P2RSn6T z(wA+#bG2_PERfg~qXHcI8CWZ{^eCZA;Lv$+=xlE2bZ+QGl%RvRx4RfGFI=ZwSoJ)% zP+l8PXI@`EUT+(VQyH+}v#_zUP*&yvjz@*&INMtN2fve5m(Z1E<^x|?(?IKV-2$I{ z@bA*Vf6B^S8h>{oeED-}=t-PvS3voBammR_To@X>X$zHtYhsuk%*M(astxsZ13qDH zuBtFEZz*dlFR0WX!gq>ox5j2~tW$>&)P-+P5q@-1DNUl7*g+TF=6Z_e6X>8rO7rpR zXY)g*TH@Rx%#-imd7Pv@0{Z7&j;f5DB55D1GiH9a6LnQdS=KwmrjGM#*CDoxonRY{ z+mgR((|8nwZDsb@<!Q&XNx<OesHJ?hr{><*96ytZ&<7ia8dI(D#c<bdiTZ_9n>Seb zuun0m#k|yH>xBFHy#9ZJ?k2+UVVjY7>Tqs&->c;X<;+fQ7XyTl*l#?@q60lm*v z>HAUe?sj?;{-sYZd>PoFRR$l>V|=da=MJKZ6)wjo#c*wHzHjfgnv(8%ac>8YN=yE^ zmD98>EBP(s#z}9s{`AGxb8K_4^7DqedqQ1cJ}zERPhSAz;6@Cy#@M~8pV)>h2H={| z1tUg?h%v2eL8J(jH)x?chN=6<0|tk_z5s8=(m$*i3}PGus26~vt{_<}cPNAiOaR9$ zbYe_+6Qt|r=L(?(Q^Sv85tHbijtwO1=IZ6+><x3Z2ie#_*uX6C)7ZrHa9il?odfS0 zqyvl{Fvz?>axh<*7jOi^aH{eEK%_Xok>=SfPcMaf!Z8zmvmeG6CL$T-`E%etdk|N= zPX_=us^G9GDg+h*pBqSU*n|KL06EWK^Z&XDhvr;-r*OM0G#&vQ8jBPfiZCc7<QO;h z+$4K4RN6X0WL+6WZ*<@b4RtD+;ui`fK{4%boQ`M-;=CXA7pkM;v&na|>!ChKYG3*= z^BJ_p?+w@wJi$#uBk>we?n~!D$TC&OY1t>$KHQXZog}>Kijl+1y|7m<7Uk8Tpkvq* zi`p7a_}ELT96kP<jM~bT`!vF5SV#;e{3{OrVZ;D~g(g<U;OkE;g9V0JUJPh%B)xMQ z7LCDV>@KzmN8Y*XH(t9$@z~5}YuM|+IqR<fhKm1n%1a%bND;d&j1xB*$8rxnKHZ51 zZ9M)|v!oYNDWTmXiue5MGgOVyFrQnk7K78inW#j))t(*G%r^?vZj%?yMF+pnG=6V6 zZOe37hUd&(AolWud3kxk>|MQJ&VY>B12zO8Wz?<is(wGE47D8`hS~~9TG5#WfuTV? z%&XhXt8(#8z-<S`3&JI<^h3A+7eNQ!iw@8WNLum2`u}xU=d^cV>4UgIihSoz0GLk@ zEW*zxAOv>;gdo3~|GtjGkp61sBf-slB*4r^LPY4?hz=g|hwO;-?snXjZF#ZNBD|vR z@kAw|$cxt0HKPjIph`qomX}<DzUQ?ALA!qyB{C<$K372a_YX}DO?sOsawVdBhbVD$ z8~JLidsabD8kh2k8`i8O2b|w7AMBfdrmfG;6*S39>iepkbR3C=D!Dv?J+IL`ohp2I zXO&No@h!cWI&0+phomWdlUBHjYL+rpNs1rBjWrEdZ^kv5<xS7ry-F`+->kG4-XOfD zBvy@YpFocO0p;ZvM@aPWvxdDCk05*7#|?L`$^=1qz>YZEiR-D$oBd&*Ci1R+`d+KD zBp<o#;-8GdlNIJ7RMrWxrH=~7=J+Ov<=?CKM*5-RDmdrvQ>#+6h$gl`3y}%xGLeVj z!Cvhh;z}H0_zd?RzbX~%h@cLylYCm33PTi&Mes+N=>2w=vO@ocNnDgD>77CXE=;}< z%ev%e91RrM_iw~2ZxUP$-WyTirA#WgTf$P=eCzTuUW+37w3pU~yDcxqUcDkM*jer) zyKrQZgI!Cw$Z?P;&yeO<`U7*zhO**)R_Tp<6rP*g5#CpO?K^d=lx$~jy>)#^`yM?3 zgYIsY$Exah(T*Y!z4u$K?5M5h`Ak=^y{1%(SG>?}wdbz38&xXoFZ1rc@yJqeY3d}6 z7YRU?SNhUvHioetEy@^Gi;Hh4yW>%&#B=m<l>SVjLo30dWq&w2Xn&RQUycrWZh!lt zbc2|Qc%S_JR+{G-`%#9!IXZuPfdbt20ij5NCBWinn3j>=h(?Hj2L<K<bD?2yq5)nw zIuaro=-d|agu1(V!Mxo(19*N4F<d3^{vnmf@OA9f9XiK4$c;aj3ZBoD4%Xzdu&}l& zi*kff;CL&Knniq+)~0YXe4wcha_nwpgBjkLzC$QjCPv#rRb-hxP9H3P2R3n|+26Ar z4WHw6LZrJ@Wo|$AV^Mbf2tM_wW{FOYi7|T5^<%9(M(G+4Bpa%*ht?J521N9;eKS6} z&&&c6Z&A-_F292uX9T%h6eW&7*hOk^8?v0aqQclE@jxsvhl)z^P5}RtuxUORa+)i> z%2$u$1$)ojnl{t8#r?aCFCv<#<C)T>J~Pj~fi`bjp?sO4t2LHpG|tO0<N9FI>r#e; z<6myst)GBsjN{M(qYUVzzmbmG*0p*`%Y1l5Md$Mbld%vow4fdNfi!qafjTm=8v1CY zW|7Rq--k9m(8Z{XBO&NrM|3Q~U1cx-9*I^hL2r(cjT<m(j%M*z=Es@F5}sCxcG2rN zqiVy1-q?=E*vN+kdIqt_SNp0=$WePX<C!2jB7@wHQejQ;7>+yU(%!Begg4MD*)8u# ziM%u*z-<Ndz9?Fj&Yi46jn2$1ggUEY;>13AJk<0o`6hTjeks$56j9y2e9~H9G6KVH zuv6%Ii6p^c%-nFu5<+YFmO5HNpyQsk=K`k2+C4l(rj4BDYtz%tgz3z+oAov%gJ>M~ zx5Bqye?%Y8bfo*Vh}F!Yx`t^f`ue5yIFIX@QT213xH|)esH>05Pq_Ec{qzg&y8yTc zARoEx9PZU?5$ti0%{2a4SYYM<6x=g`8Q_KyGBMRJxYs=I|8D_b2n@am`0(bxv#WoC z{Fk%&Nb{4shv;NA?<~vTrJ35&zu>*`#(rN;X4KavwQ8-}6LeEvG0NIMY7`{O@~x`i zh-sxL>k%UZWutI1<1@{yu%O`)6gktr`sX=GPcMxJ*)z_=ES6CHhodJv-1(Vx>Z8Tk z6WN3^_2j?~h2iPJxO7>*C#3f+(-GotMk0R-dHRvdl|U=$)s2w?{_#=ecZM9*-^tcg zf)e@Co1WY^+}JfxMxo0$Lvx?;nA)3(%cQ>bMxsFNb>Fq`%~`qon6H_vYgcjU=RMgH zaw;7_*WJWRBO#c<*e^anR~P*8Fzvx{0$~ScbFc1)x>&Dc(4lat-}`i2reSde^Z$ZL zpI6_uzx5@NP8Btd?qlGcz>cw{18|EoHGyHq4wc0KJ0CK!f|`|Mq^h<zFB*Li;e14T z_uVa*;4%B~8^jLd9&E<ruV+3GkYpaaFh#rGHg>-}5|4>cQr_|qBJ9!=K|*KJDsKaF zQt`gkIwgkJ{>GRrp(tb1H@23TNF3YGud;dRGW*pe&zDwIoaU<Y;og4xf=YprYVnym zowNQg)9)y8%5x&_&`{-nrg(zY8ouw=5^s<!K0I9fnr<Vv=5@spCtIcl^;n1JRAFbE znd<gTP#SFAA!K<a<B3q?vFm5fR?se#a#9cT2J`f>m9^*I4GN?$HuVDs)l1?wx9k)C z4<TQ(`W1RKsiK=mS3UIYyVUa4*{oN;LH^%f@OO}p`0s&yjL70`GMqy>s&<>XJv{}C zLw6b(wzS)gUG367>X;q@OD<_IRf=LP2f*HsUt&zxgR`%olQ}_C{Sd1P8wIgLCp}2Z zyvap^3}5c?9z28k#+x8EU4IuQVf*+giFW~(?hsch1-an1mXlOMewvl2zmv*Raqh0p ztQJAC^-2iu{M)&f+d>L{{GT2l+|J~RRf7=Xvt*+*H=@L2Z#Eqo-xnuq<n76*IKHWA z#8V)C$Zi(buF^YylbE)qtyzXvdq#bn#GIfTg8s#Wb%$CMb2{u}TwQ9E`O)^I8Kig) z(vY$&r|jKDwzNZ!Y{k~q(?^smqq64|gArfPN3rFT(;1AQfts3CK#tT=r*p3yB+AZd zw|~Fdye?_*QSp1KJ#J}OC`o<&qtCGtuMf)Z3(CmV(2#hAzTrR=%!G_^C%8n+hNu}V zNOeW{OvZMDo7WQh7%_6I$~Tam#Z=TVi|{<V^_>`G)R~w`9IAY=uHm4&+wNuZen%B$ z>BdQ*43;%_{boYSJ7s0IY|kr&k+Nr5p8=Wl-iS!{P_sC&G<<u|+3pgX-wdL^?{TM( z?;f#)<n<(N!OEnR{2_|x*Is<A_C+O|v1fgLg9e?EVe1MOwE(&t@$(4B+q0C$ZNY1_ z^Hd^lO{*1?oI)Ofi+bb7D<Gltv(N2>hmy-8qXM9Vr;twx_3(k&S^0ZGZGdP1)Y``j z<_h)lvax~yr@#9)@qGLV`$$oM)f)z|IBRFHkBD*+?@<8rUgrYd0}+5<)S&!XCx8PB z?*$$Q;DNA!FP*_Y?H^~MGUtN;z@Hm(>cEPEg#fQr0M7Ws9a!*%=6_G8|H_Gc%}d!r z-stx(xy-^Cms~@D3Mb<m<Al+0r-Q=Rdcm$pWKegtd=Z0|y!0BGp%9<jyr#A7-jP;T z`K5_(_rp1&u^5JkL<F4U5nPRPCuG*C7*hANRrQR!@I^Ef_FZ;)1V?GFt<8UZ=o8XY zMqK$c=8KqXg$0L*HPS<(pyPyM<TL!S1KWZL0V6O<2{CF{1`!cXt|OrT)#kj&o?rFn z(<YoUA`>#7Z6^`B;;48{HSYr9_P3`m_@%%rMh5&+ACuC1$b`$Q`l|hVWvb6`Gq+wr zVav?EuZ$W;bvtPL?^aUI)JKlYNgP^(N+MJYp&RpisSHxv!#51+6r*(|4f7s7+U5A- zvC`7<y+&DKek|8%Nk1@?HRGCsHOWfvp(`>`K!^yfQds;U`7uWt=OgRlVu{w^B%^*~ zj<8zcfYWu0cSdpiM*K{82mV~F$Si<;!U!zbxU<DdAW(Sn9bBzibeW%ACNIU#=i=Ih zyQZO?7Z&gTN5s#0Yz�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 literal 0 HcmV?d00001 diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java index dc9bf804c24..1008e0860c1 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java @@ -29,7 +29,6 @@ import net.lemnik.eodsql.Select; import net.lemnik.eodsql.TransactionQuery; import net.lemnik.eodsql.TypeMapper; import net.lemnik.eodsql.spi.util.NonUpdateCapableDataObjectBinding; - import ch.rinn.restrictions.Friend; import ch.rinn.restrictions.Private; import ch.systemsx.cisd.openbis.generic.server.business.bo.common.GenericEntityPropertyRecord; @@ -43,11 +42,10 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.StringArrayMapper; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; /** - * A {@link TransactionQuery} interface for obtaining large sets of sample-related entities from the - * database. + * A {@link TransactionQuery} interface for obtaining large sets of sample-related entities from the database. * <p> - * This interface is intended to be used only in this package. The <code>public</code> modifier is - * needed for creating a dynamic proxy by the EOD SQL library. + * This interface is intended to be used only in this package. The <code>public</code> modifier is needed for creating a dynamic proxy by the EOD SQL + * library. * * @author Bernd Rinn */ @@ -165,8 +163,7 @@ public interface ISampleListingQuery extends BaseQuery, IPropertyListingQuery String groupCode, long sampleTypeId); /** - * Returns the samples for the given <var>groupCode</var> and <var>sampleTypeId</var> that are - * assigned to an experiment. + * Returns the samples for the given <var>groupCode</var> and <var>sampleTypeId</var> that are assigned to an experiment. */ @Select(sql = SELECT_FROM_SAMPLES_S + " join spaces g on s.space_id=g.id " + " where s.expe_id is not null and g.dbin_id=?{1} and g.code=?{2} and s.saty_id=?{3} " @@ -200,8 +197,7 @@ public interface ISampleListingQuery extends BaseQuery, IPropertyListingQuery long sampleTypeId); /** - * Returns the samples for all spaces and <var>sampleTypeId</var> that are assigned to an - * experiment. + * Returns the samples for all spaces and <var>sampleTypeId</var> that are assigned to an experiment. */ @Select(sql = SELECT_FROM_SAMPLES_S + " join spaces g on s.space_id=g.id " + " where s.expe_id is not null and g.dbin_id=?{1} and s.saty_id=?{2} " @@ -282,9 +278,8 @@ public interface ISampleListingQuery extends BaseQuery, IPropertyListingQuery // /** - * Returns all samples with a <var>propertyType</var> attached having specified - * <var>popertyValue</var>. Additionally id of the sample SHOULDN'T be in the specified set of - * ids. + * Returns all samples with a <var>propertyType</var> attached having specified <var>popertyValue</var>. Additionally id of the sample SHOULDN'T + * be in the specified set of ids. */ @Select(sql = SELECT_FROM_SAMPLES_S + " where s.saty_id=?{1} and s.id in (" + " select samp_id from sample_properties sp where sp.stpt_id in (" @@ -296,6 +291,22 @@ public interface ISampleListingQuery extends BaseQuery, IPropertyListingQuery public DataIterator<SampleRecord> getSamplesWithPropertyValue(long sampleTypeId, String propertyTypeCode, String propertyValue, LongSet sampleIds); + /** + * Returns all samples with a <var>propertyType</var> and s specific <var>propertyValue</var> The <var>propertyValue</var> is a term of a + * controlled vocabulary in this case. Additionally <var>sampleTypeId</var> should not be in the the list of <var>sampleIds</var> + */ + @Select(sql = SELECT_FROM_SAMPLES_S + " where s.saty_id=?{1} and s.id in (" + + " select samp_id from sample_properties sp where sp.stpt_id in (" + + " select id from sample_type_property_types stpt where stpt.prty_id = " + + " (select id from property_types where code=?{2})" + + " ) and cvte_id in ( " + + " select id from controlled_vocabulary_terms where code=?{3}" + + " )" + + " ) and not id = any(?{4})", parameterBindings = + { TypeMapper.class, TypeMapper.class, TypeMapper.class, LongSetMapper.class }, fetchSize = FETCH_SIZE) + public DataIterator<SampleRecord> getSamplesWithControlledVocabularyWithPropertyValue(long sampleTypeId, + String propertyTypeCode, String propertyValue, LongSet sampleIds); + // // Shared samples // @@ -335,8 +346,7 @@ public interface ISampleListingQuery extends BaseQuery, IPropertyListingQuery } /** - * Returns the sample type for the given <code>sampleCode</code>. Note that the code of the - * result is already HTML escaped. + * Returns the sample type for the given <code>sampleCode</code>. Note that the code of the result is already HTML escaped. */ @Select(sql = "select id, code, generated_from_depth, part_of_depth from sample_types" + " where code=?{2} and dbin_id=?{1}", resultSetBinding = SampleTypeDataObjectBinding.class) @@ -408,8 +418,7 @@ public interface ISampleListingQuery extends BaseQuery, IPropertyListingQuery LongSet sampleIds); /** - * Returns all controlled vocabulary property values of all samples specified by - * <var>sampleIds</var>. + * Returns all controlled vocabulary property values of all samples specified by <var>sampleIds</var>. * * @param sampleIds The set of sample ids to get the property values for. */ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java index 319415b98b0..9ed88b980a3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java @@ -59,19 +59,16 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper; /** - * A business worker object for fast sample listing. It has only one interface method, which is - * {@link #load()}. This method deals with + * A business worker object for fast sample listing. It has only one interface method, which is {@link #load()}. This method deals with * <ul> * <li>information stored in the sample table</li> * <li>sample type information</li> * <li>assigned experiment, project, group and database instance</li> * <li>sample relationships (parent-child and contained-container)</li> * </ul> - * It delegates the work of enriching the samples with properties to an implementation of a - * {@link IEntityPropertiesEnricher}. The worker follows the logic that only the samples specified - * by the {@link ListSampleCriteria}, the <i>primary samples</i>, should be enriched with properties - * (as only primary samples are shown in a separate row of the list). From <i>dependent samples</i>, - * only basic information is obtained. + * It delegates the work of enriching the samples with properties to an implementation of a {@link IEntityPropertiesEnricher}. The worker follows the + * logic that only the samples specified by the {@link ListSampleCriteria}, the <i>primary samples</i>, should be enriched with properties (as only + * primary samples are shown in a separate row of the list). From <i>dependent samples</i>, only basic information is obtained. * * @author Bernd Rinn */ @@ -214,8 +211,8 @@ final class SampleListingWorker extends AbstractLister // /** - * Load the samples defined by the criteria given to the constructor. The samples will be - * enriched with sample properties and dependencies to parents and container will be resolved. + * Load the samples defined by the criteria given to the constructor. The samples will be enriched with sample properties and dependencies to + * parents and container will be resolved. */ public List<Sample> load() { @@ -234,7 +231,8 @@ final class SampleListingWorker extends AbstractLister retrievePrimaryBasicSamples(tryGetIteratorForContainedSamples()); retrievePrimaryBasicSamples(tryGetIteratorForParentSamples()); retrievePrimaryBasicSamples(tryGetIteratorForChildSamples()); - retrievePrimaryBasicSamples(tryGetIteratorForNewTrackedSamples()); + retrievePrimaryBasicSamples(tryGetIteratorForNewTrackedProcessedSamples()); + retrievePrimaryBasicSamples(tryGetIteratorForNewTrackedToBeProcessedSamples()); retrievePrimaryBasicSamples(tryGetIteratorForMetaprojectSamples()); if (operationLog.isDebugEnabled()) { @@ -589,7 +587,7 @@ final class SampleListingWorker extends AbstractLister } } - private Iterable<SampleRecord> tryGetIteratorForNewTrackedSamples() + private Iterable<SampleRecord> tryGetIteratorForNewTrackedProcessedSamples() { if (criteria.getSampleTypeCode() == null) { @@ -601,6 +599,21 @@ final class SampleListingWorker extends AbstractLister final String propertyValue = criteria.getPropertyValue(); return query.getSamplesWithPropertyValue(sampleTypeId, propertyTypeCode, propertyValue, new LongOpenHashSet(criteria.getAlreadyTrackedSampleIds())); + + } + + private Iterable<SampleRecord> tryGetIteratorForNewTrackedToBeProcessedSamples() + { + if (criteria.getSampleTypeCode() == null) + { + return null; + } + final long sampleTypeId = + referencedEntityDAO.getSampleTypeIdForSampleTypeCode(criteria.getSampleTypeCode()); + final String propertyTypeCode = criteria.getPropertyTypeCode(); + final String propertyValue = criteria.getPropertyValue(); + return query.getSamplesWithControlledVocabularyWithPropertyValue(sampleTypeId, propertyTypeCode, propertyValue, + new LongOpenHashSet(criteria.getAlreadyTrackedSampleIds())); } private void retrievePrimaryBasicSamples(final Iterable<SampleRecord> sampleIteratorOrNull) -- GitLab