extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/release/NoSpecimenWriter.java

Code
Comments
Other
Rev Date Author Line
5136 22 Nov 18 nicklas 1 package net.sf.basedb.reggie.plugins.release;
5136 22 Nov 18 nicklas 2
5136 22 Nov 18 nicklas 3 import java.time.LocalDateTime;
5136 22 Nov 18 nicklas 4 import java.time.temporal.ChronoUnit;
5136 22 Nov 18 nicklas 5 import java.util.ArrayList;
5136 22 Nov 18 nicklas 6 import java.util.List;
5136 22 Nov 18 nicklas 7
5136 22 Nov 18 nicklas 8 import org.json.simple.JSONArray;
5136 22 Nov 18 nicklas 9 import org.json.simple.JSONObject;
5136 22 Nov 18 nicklas 10
5136 22 Nov 18 nicklas 11 import net.sf.basedb.core.BioMaterialEvent;
5136 22 Nov 18 nicklas 12 import net.sf.basedb.core.DbControl;
5136 22 Nov 18 nicklas 13 import net.sf.basedb.core.Item;
5136 22 Nov 18 nicklas 14 import net.sf.basedb.core.Quantity;
5136 22 Nov 18 nicklas 15 import net.sf.basedb.core.Sample;
5136 22 Nov 18 nicklas 16 import net.sf.basedb.core.Type;
5136 22 Nov 18 nicklas 17 import net.sf.basedb.core.Unit;
5136 22 Nov 18 nicklas 18 import net.sf.basedb.reggie.Site;
5136 22 Nov 18 nicklas 19 import net.sf.basedb.reggie.dao.Annotationtype;
5136 22 Nov 18 nicklas 20 import net.sf.basedb.reggie.dao.NoSpecimen;
5136 22 Nov 18 nicklas 21 import net.sf.basedb.reggie.json.FilteredJSONArray;
5136 22 Nov 18 nicklas 22 import net.sf.basedb.util.filter.NotNullFilter;
5136 22 Nov 18 nicklas 23 import net.sf.basedb.util.units.UnitUtil;
5136 22 Nov 18 nicklas 24
5136 22 Nov 18 nicklas 25 /**
5136 22 Nov 18 nicklas 26   Cohort writer implementation for the NoSpecimen data table.
5136 22 Nov 18 nicklas 27   @since 4.21
5136 22 Nov 18 nicklas 28 */
5136 22 Nov 18 nicklas 29 public class NoSpecimenWriter 
5136 22 Nov 18 nicklas 30   extends CohortWriter 
5136 22 Nov 18 nicklas 31 {
5136 22 Nov 18 nicklas 32
5136 22 Nov 18 nicklas 33   public NoSpecimenWriter(DbControl dc, ReleaseWriterOptions options)
5136 22 Nov 18 nicklas 34   {
5136 22 Nov 18 nicklas 35     super(dc, options);
5136 22 Nov 18 nicklas 36   }
5136 22 Nov 18 nicklas 37   
5136 22 Nov 18 nicklas 38   
5136 22 Nov 18 nicklas 39   @Override
5136 22 Nov 18 nicklas 40   public JSONArray toJSONObjects(CohortItem item)
5136 22 Nov 18 nicklas 41   {
5136 22 Nov 18 nicklas 42     List<NoSpecimen> noSpecimens = item.getNoSpecimens();
5136 22 Nov 18 nicklas 43     if (noSpecimens.size() == 0) return null;
5136 22 Nov 18 nicklas 44     DbControl dc = item.getDbControl();
5136 22 Nov 18 nicklas 45     
5136 22 Nov 18 nicklas 46     JSONArray json = new JSONArray();
5136 22 Nov 18 nicklas 47     for (NoSpecimen sp : noSpecimens)
5136 22 Nov 18 nicklas 48     {
5136 22 Nov 18 nicklas 49       Sample noSpecimen = sp.getItem();
5136 22 Nov 18 nicklas 50       BioMaterialEvent creationEvent = noSpecimen.getCreationEvent();
5136 22 Nov 18 nicklas 51       Sample theCase = sp.getCase().getItem();
5136 22 Nov 18 nicklas 52       
5136 22 Nov 18 nicklas 53       JSONObject jsonSp = new JSONObject();
5136 22 Nov 18 nicklas 54       jsonSp.put("name", noSpecimen.getExternalId());
5136 22 Nov 18 nicklas 55       jsonSp.put("type", noSpecimen.getType().name());
5136 22 Nov 18 nicklas 56       jsonSp.put("subtype", getName(noSpecimen.getItemSubtype()));
5136 22 Nov 18 nicklas 57       jsonSp.put("parent", theCase.getExternalId());
5136 22 Nov 18 nicklas 58       
5136 22 Nov 18 nicklas 59       LocalDateTime samplingDateTime = item.getDateTimeAnnotation(Annotationtype.SAMPLING_DATETIME, noSpecimen);
5136 22 Nov 18 nicklas 60       LocalDateTime refDate = item.getDateTimeAnnotation(Annotationtype.REFERENCE_DATE, theCase);
5136 22 Nov 18 nicklas 61       
5136 22 Nov 18 nicklas 62       Site site = Site.findByCaseName(noSpecimen.getName());
5136 22 Nov 18 nicklas 63       
5136 22 Nov 18 nicklas 64       JSONArray jsonAnnotations = new FilteredJSONArray(new NotNullFilter<>(false));
5136 22 Nov 18 nicklas 65       if (site != null && site != Site.UNKNOWN)
5136 22 Nov 18 nicklas 66       {
5136 22 Nov 18 nicklas 67         jsonAnnotations.add(item.createAnnotationJSON("Site", site.getName()));
5136 22 Nov 18 nicklas 68       }
5136 22 Nov 18 nicklas 69
5136 22 Nov 18 nicklas 70       if (samplingDateTime != null && refDate != null)
5136 22 Nov 18 nicklas 71       {
5136 22 Nov 18 nicklas 72         Integer samplingDays = (int)ChronoUnit.DAYS.between(refDate, samplingDateTime.truncatedTo(ChronoUnit.DAYS));
5136 22 Nov 18 nicklas 73         jsonAnnotations.add(item.createAnnotationJSON("SamplingDate", samplingDays));
5136 22 Nov 18 nicklas 74       }
5136 22 Nov 18 nicklas 75       
5136 22 Nov 18 nicklas 76       jsonAnnotations.add(item.getAnnotationJSON(Annotationtype.LATERALITY, noSpecimen, null));
5136 22 Nov 18 nicklas 77         
5136 22 Nov 18 nicklas 78       jsonSp.put("annotations", jsonAnnotations);
5136 22 Nov 18 nicklas 79       json.add(jsonSp);
5136 22 Nov 18 nicklas 80     }
5136 22 Nov 18 nicklas 81     
5136 22 Nov 18 nicklas 82     return json;
5136 22 Nov 18 nicklas 83   }
5136 22 Nov 18 nicklas 84   
5136 22 Nov 18 nicklas 85   @Override
5136 22 Nov 18 nicklas 86   public List<CohortTypeDef> getTypeDefsInJSON()
5136 22 Nov 18 nicklas 87   {
5136 22 Nov 18 nicklas 88     DbControl dc = getDbControl();
5136 22 Nov 18 nicklas 89
5136 22 Nov 18 nicklas 90     CohortTypeDefFactory spFactory = new CohortTypeDefFactory(dc, Item.SAMPLE, "NoSpecimen");
5136 22 Nov 18 nicklas 91     
5136 22 Nov 18 nicklas 92     List<String> allSites = new ArrayList<String>();
5136 22 Nov 18 nicklas 93     for (Site s : Site.getAllSites())
5136 22 Nov 18 nicklas 94     {
5136 22 Nov 18 nicklas 95       allSites.add(s.getName());
5136 22 Nov 18 nicklas 96     }
5136 22 Nov 18 nicklas 97     spFactory.createAnnotationType("Site", Type.STRING).setEnumeration(allSites);
5136 22 Nov 18 nicklas 98     
5136 22 Nov 18 nicklas 99     // Calculated from SamplingDate - ReferenceDate (on the case)
5136 22 Nov 18 nicklas 100     Unit days = UnitUtil.getUnit(dc, Quantity.TIME, "d");
5136 22 Nov 18 nicklas 101     spFactory.createAnnotationType("SamplingDate", Type.INT).setUnit(days).setProjectSpecificValues(true);
5136 22 Nov 18 nicklas 102
5973 24 Jun 20 nicklas 103     spFactory.createAnnotationType(Annotationtype.LATERALITY).setProjectSpecificValues(true);
5136 22 Nov 18 nicklas 104
5136 22 Nov 18 nicklas 105     return spFactory.allCreated();
5136 22 Nov 18 nicklas 106   }
5136 22 Nov 18 nicklas 107
5136 22 Nov 18 nicklas 108 }