extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/dao/Datafiletype.java

Code
Comments
Other
Rev Date Author Line
2565 11 Aug 14 nicklas 1 package net.sf.basedb.reggie.dao;
2565 11 Aug 14 nicklas 2
2565 11 Aug 14 nicklas 3 import java.lang.reflect.Field;
5827 19 Feb 20 nicklas 4 import java.util.ArrayList;
5827 19 Feb 20 nicklas 5 import java.util.Collections;
2565 11 Aug 14 nicklas 6 import java.util.List;
2565 11 Aug 14 nicklas 7
4668 01 Feb 18 nicklas 8 import org.json.simple.JSONObject;
4668 01 Feb 18 nicklas 9
2565 11 Aug 14 nicklas 10 import net.sf.basedb.core.DataFileType;
2565 11 Aug 14 nicklas 11 import net.sf.basedb.core.DbControl;
3935 13 May 16 nicklas 12 import net.sf.basedb.core.File;
3935 13 May 16 nicklas 13 import net.sf.basedb.core.FileSetMember;
3935 13 May 16 nicklas 14 import net.sf.basedb.core.FileStoreEnabled;
2565 11 Aug 14 nicklas 15 import net.sf.basedb.core.Include;
2565 11 Aug 14 nicklas 16 import net.sf.basedb.core.InvalidDataException;
2565 11 Aug 14 nicklas 17 import net.sf.basedb.core.Item;
2565 11 Aug 14 nicklas 18 import net.sf.basedb.core.ItemNotFoundException;
2565 11 Aug 14 nicklas 19 import net.sf.basedb.core.ItemQuery;
2565 11 Aug 14 nicklas 20 import net.sf.basedb.core.Type;
2565 11 Aug 14 nicklas 21 import net.sf.basedb.core.query.Expressions;
2565 11 Aug 14 nicklas 22 import net.sf.basedb.core.query.Hql;
2565 11 Aug 14 nicklas 23 import net.sf.basedb.core.query.Restrictions;
2565 11 Aug 14 nicklas 24
2565 11 Aug 14 nicklas 25 /**
2565 11 Aug 14 nicklas 26   Used to define file types for data files.
2565 11 Aug 14 nicklas 27   
2565 11 Aug 14 nicklas 28   @author nicklas
2565 11 Aug 14 nicklas 29   @since 2.16
2565 11 Aug 14 nicklas 30 */
2565 11 Aug 14 nicklas 31 public class Datafiletype 
2565 11 Aug 14 nicklas 32 {
2565 11 Aug 14 nicklas 33
2565 11 Aug 14 nicklas 34   /**
2565 11 Aug 14 nicklas 35     The file server containing analyzed data files.
2565 11 Aug 14 nicklas 36   */
2565 11 Aug 14 nicklas 37   public static final Datafiletype FASTQ = 
2565 11 Aug 14 nicklas 38     new Datafiletype("FASTQ", "net.sf.basedb.reggie.fastq", 
2565 11 Aug 14 nicklas 39       Item.DERIVEDBIOASSAY, "fastq.gz", Subtype.SEQUENCE_DATA,
2565 11 Aug 14 nicklas 40       true, true,
2565 11 Aug 14 nicklas 41       "Compressed FASTQ files with sequence data");
2565 11 Aug 14 nicklas 42
2565 11 Aug 14 nicklas 43   /**
2565 11 Aug 14 nicklas 44     The file server containing analyzed data files.
2565 11 Aug 14 nicklas 45   */
2565 11 Aug 14 nicklas 46   public static final Datafiletype BAM = 
2565 11 Aug 14 nicklas 47     new Datafiletype("Compressed Sequence Alignment/Map", "assembly.bam", 
2565 11 Aug 14 nicklas 48       Item.DERIVEDBIOASSAY, "bam", Subtype.ALIGNED_SEQUENCE_DATA, 
2565 11 Aug 14 nicklas 49       true, false,
2565 11 Aug 14 nicklas 50       "BAM format is a BGZF-compressed SAM file.");
2565 11 Aug 14 nicklas 51
2565 11 Aug 14 nicklas 52   /**
2721 01 Oct 14 nicklas 53     File type for Cufflinks fpkm_tracking files.
2721 01 Oct 14 nicklas 54     @since 2.17
2721 01 Oct 14 nicklas 55   */
2721 01 Oct 14 nicklas 56   public static final Datafiletype FPKM = 
2721 01 Oct 14 nicklas 57     new Datafiletype("FPKM tracking file", "sequencing.fpkm_tracking", 
2721 01 Oct 14 nicklas 58       Item.RAWBIOASSAY, "fpkm_tracking", Subtype.RAW_DATA, 
2721 01 Oct 14 nicklas 59       true, false,
2721 01 Oct 14 nicklas 60       "Gene- or isoform expression levels in Fragments Per Kilobase of exon model per Million mapped fragments.");
4669 02 Feb 18 nicklas 61
2721 01 Oct 14 nicklas 62   /**
4669 02 Feb 18 nicklas 63     Generic raw data file. Is defined by BASE core.
4669 02 Feb 18 nicklas 64     @since 4.15
4669 02 Feb 18 nicklas 65   */
4669 02 Feb 18 nicklas 66   public static final Datafiletype GENERIC_RAWDATA = 
4669 02 Feb 18 nicklas 67     new Datafiletype("Generic raw data", "generic.rawdata", 
4669 02 Feb 18 nicklas 68       Item.RAWBIOASSAY, null, Subtype.RAW_DATA, 
4669 02 Feb 18 nicklas 69       false, true, null);
4669 02 Feb 18 nicklas 70
4673 08 Feb 18 nicklas 71   /**
4673 08 Feb 18 nicklas 72     GTF file for array design. Is defined by BASE core.
4673 08 Feb 18 nicklas 73     @since 4.15
4673 08 Feb 18 nicklas 74   */
4673 08 Feb 18 nicklas 75   public static final Datafiletype GTF = 
4673 08 Feb 18 nicklas 76     new Datafiletype("GTF ref-seq file", "refseq.gtf", 
4673 08 Feb 18 nicklas 77       Item.ARRAYDESIGN, null, null, 
4673 08 Feb 18 nicklas 78       true, false, null);
4673 08 Feb 18 nicklas 79
4669 02 Feb 18 nicklas 80   /**
5706 07 Nov 19 nicklas 81     Variant call file.
5706 07 Nov 19 nicklas 82     @since 4.24
5706 07 Nov 19 nicklas 83   */
5706 07 Nov 19 nicklas 84   public static final Datafiletype VCF = 
5706 07 Nov 19 nicklas 85     new Datafiletype("VCF", "net.sf.basedb.reggie.vcf", 
5706 07 Nov 19 nicklas 86       Item.RAWBIOASSAY, "vcf", Subtype.VARIANT_CALL_FORMAT,
5706 07 Nov 19 nicklas 87       true, true,
5706 07 Nov 19 nicklas 88       "Variant call file");
5706 07 Nov 19 nicklas 89
5706 07 Nov 19 nicklas 90   /**
6542 18 Jan 22 nicklas 91     Variant call file used as an array design.
6542 18 Jan 22 nicklas 92     @since 4.35
6542 18 Jan 22 nicklas 93   */
6542 18 Jan 22 nicklas 94   public static final Datafiletype VCF_DESIGN = 
6542 18 Jan 22 nicklas 95     new Datafiletype("VCF (design)", "net.sf.basedb.reggie.vcf-design", 
6542 18 Jan 22 nicklas 96       Item.ARRAYDESIGN, "vcf", Subtype.VARIANT_CALL_FORMAT,
6542 18 Jan 22 nicklas 97       false, false,
6542 18 Jan 22 nicklas 98       "Variant call file used as an array design");
6542 18 Jan 22 nicklas 99
6542 18 Jan 22 nicklas 100   
6542 18 Jan 22 nicklas 101   /**
6475 05 Nov 21 nicklas 102     Genotype call file.
6475 05 Nov 21 nicklas 103     @since 4.34
6475 05 Nov 21 nicklas 104   */
6475 05 Nov 21 nicklas 105   public static final Datafiletype GTC = 
6475 05 Nov 21 nicklas 106     new Datafiletype("GTC", "net.sf.basedb.reggie.gtc", 
6475 05 Nov 21 nicklas 107       Item.DERIVEDBIOASSAY, "gtc", Subtype.GENOTYPE_CALL_FILE,
6475 05 Nov 21 nicklas 108       true, true,
6475 05 Nov 21 nicklas 109       "Genotype call file");
6475 05 Nov 21 nicklas 110
6475 05 Nov 21 nicklas 111   /**
6866 14 Nov 22 nicklas 112     IDAT file.
6866 14 Nov 22 nicklas 113     @since 4.41
6866 14 Nov 22 nicklas 114   */
6866 14 Nov 22 nicklas 115   public static final Datafiletype IDAT = 
6866 14 Nov 22 nicklas 116     new Datafiletype("IDAT", "net.sf.basedb.reggie.idat", 
6866 14 Nov 22 nicklas 117       Item.DERIVEDBIOASSAY, "idat", Subtype.IDAT,
6866 14 Nov 22 nicklas 118       true, true,
6866 14 Nov 22 nicklas 119       "Illumina BeadArray Data");
6866 14 Nov 22 nicklas 120
6866 14 Nov 22 nicklas 121   
6866 14 Nov 22 nicklas 122   /**
2565 11 Aug 14 nicklas 123     Get the file type by name of the static constant defined in this class.
2565 11 Aug 14 nicklas 124     
2565 11 Aug 14 nicklas 125     @param cName The name of the static constant
2565 11 Aug 14 nicklas 126     @return A bioplate type object or null if not found
2565 11 Aug 14 nicklas 127    */
2565 11 Aug 14 nicklas 128   public static Datafiletype getByCName(String cName)
2565 11 Aug 14 nicklas 129   {
2565 11 Aug 14 nicklas 130     if (cName == null) return null;
2565 11 Aug 14 nicklas 131     Datafiletype fs = null;
2565 11 Aug 14 nicklas 132     try
2565 11 Aug 14 nicklas 133     {
2565 11 Aug 14 nicklas 134       Field f = Datafiletype.class.getDeclaredField(cName);
2565 11 Aug 14 nicklas 135       fs = (Datafiletype)f.get(null);
2565 11 Aug 14 nicklas 136     }
2565 11 Aug 14 nicklas 137     catch (NoSuchFieldException ex)
2565 11 Aug 14 nicklas 138     {}
2565 11 Aug 14 nicklas 139     catch (IllegalAccessException ex)
2565 11 Aug 14 nicklas 140     {}
2565 11 Aug 14 nicklas 141     catch (ClassCastException ex)
2565 11 Aug 14 nicklas 142     {}
2565 11 Aug 14 nicklas 143     return fs;
2565 11 Aug 14 nicklas 144   }
2565 11 Aug 14 nicklas 145   
2565 11 Aug 14 nicklas 146   private final String name;
2565 11 Aug 14 nicklas 147   private final String externalId;
2565 11 Aug 14 nicklas 148   private final Item itemType;
2565 11 Aug 14 nicklas 149   private final String fileExtension;
2565 11 Aug 14 nicklas 150   private final Subtype subtype;
2565 11 Aug 14 nicklas 151   private final boolean required;
2565 11 Aug 14 nicklas 152   private final boolean allowMultiple;
2565 11 Aug 14 nicklas 153   private final String description;
2565 11 Aug 14 nicklas 154   private int id;
4668 01 Feb 18 nicklas 155   private JSONObject json;
2565 11 Aug 14 nicklas 156   
2565 11 Aug 14 nicklas 157   /**
2565 11 Aug 14 nicklas 158     Create a new definition
2565 11 Aug 14 nicklas 159   */
2565 11 Aug 14 nicklas 160   private Datafiletype(String name, String externalId, Item itemType, String fileExtension, Subtype subtype, boolean required, boolean allowMultiple, String description)
2565 11 Aug 14 nicklas 161   {
2565 11 Aug 14 nicklas 162     this.name = name;
2565 11 Aug 14 nicklas 163     this.externalId = externalId;
2565 11 Aug 14 nicklas 164     this.itemType = itemType;
2565 11 Aug 14 nicklas 165     this.fileExtension = fileExtension;
2565 11 Aug 14 nicklas 166     this.subtype = subtype;
2565 11 Aug 14 nicklas 167     this.required = required;
2565 11 Aug 14 nicklas 168     this.allowMultiple = allowMultiple;
2565 11 Aug 14 nicklas 169     this.description = description;
2565 11 Aug 14 nicklas 170   }
2565 11 Aug 14 nicklas 171     
2565 11 Aug 14 nicklas 172   /**
2565 11 Aug 14 nicklas 173     Get the name of the biomaterial list.
2565 11 Aug 14 nicklas 174   */
2565 11 Aug 14 nicklas 175   public String getName()
2565 11 Aug 14 nicklas 176   {
2565 11 Aug 14 nicklas 177     return name;
2565 11 Aug 14 nicklas 178   }
2565 11 Aug 14 nicklas 179   
2565 11 Aug 14 nicklas 180   /**
2565 11 Aug 14 nicklas 181     Get the list description.
2565 11 Aug 14 nicklas 182   */
2565 11 Aug 14 nicklas 183   public String getDescription()
2565 11 Aug 14 nicklas 184   {
2565 11 Aug 14 nicklas 185     return description;
2565 11 Aug 14 nicklas 186   }
2565 11 Aug 14 nicklas 187   
2565 11 Aug 14 nicklas 188   /**
2565 11 Aug 14 nicklas 189     Get the external id.
2565 11 Aug 14 nicklas 190   */
2565 11 Aug 14 nicklas 191   public String getExternalId()
2565 11 Aug 14 nicklas 192   {
2565 11 Aug 14 nicklas 193     return externalId;
2565 11 Aug 14 nicklas 194   }
2565 11 Aug 14 nicklas 195   
2565 11 Aug 14 nicklas 196   public Item getItemType()
2565 11 Aug 14 nicklas 197   {
2565 11 Aug 14 nicklas 198     return itemType;
2565 11 Aug 14 nicklas 199   }
2565 11 Aug 14 nicklas 200   
2565 11 Aug 14 nicklas 201   public String getExtension()
2565 11 Aug 14 nicklas 202   {
2565 11 Aug 14 nicklas 203     return fileExtension;
2565 11 Aug 14 nicklas 204   }
2565 11 Aug 14 nicklas 205   
2565 11 Aug 14 nicklas 206   public Subtype getSubtype()
2565 11 Aug 14 nicklas 207   {
2565 11 Aug 14 nicklas 208     return subtype;
2565 11 Aug 14 nicklas 209   }
2565 11 Aug 14 nicklas 210   
2565 11 Aug 14 nicklas 211   public boolean isRequired()
2565 11 Aug 14 nicklas 212   {
2565 11 Aug 14 nicklas 213     return required;
2565 11 Aug 14 nicklas 214   }
2565 11 Aug 14 nicklas 215   
2565 11 Aug 14 nicklas 216   public boolean getAllowMultiple()
2565 11 Aug 14 nicklas 217   {
2565 11 Aug 14 nicklas 218     return allowMultiple;
2565 11 Aug 14 nicklas 219   }
2565 11 Aug 14 nicklas 220   
2565 11 Aug 14 nicklas 221   /**
2709 30 Sep 14 nicklas 222     Load the file type as a BASE item
2565 11 Aug 14 nicklas 223     @param dc The DbControl to use for database access
2565 11 Aug 14 nicklas 224     @return An FileServer object
2565 11 Aug 14 nicklas 225   */
2565 11 Aug 14 nicklas 226   public DataFileType load(DbControl dc)
2565 11 Aug 14 nicklas 227   {
2565 11 Aug 14 nicklas 228     DataFileType type = null;
2565 11 Aug 14 nicklas 229     if (id == 0)
2565 11 Aug 14 nicklas 230     {
2565 11 Aug 14 nicklas 231       List<DataFileType> result = list(dc);
2565 11 Aug 14 nicklas 232       if (result.size() == 0)
2565 11 Aug 14 nicklas 233       {
2565 11 Aug 14 nicklas 234         throw new ItemNotFoundException("DataFileType["+getName()+"]");
2565 11 Aug 14 nicklas 235       }
2565 11 Aug 14 nicklas 236       else if (result.size() > 1)
2565 11 Aug 14 nicklas 237       {
2565 11 Aug 14 nicklas 238         throw new InvalidDataException("Found > 1 DataFileType["+getName()+"]");
2565 11 Aug 14 nicklas 239       }
2565 11 Aug 14 nicklas 240       type = result.get(0);
2565 11 Aug 14 nicklas 241       id = type.getId();
2565 11 Aug 14 nicklas 242     }
2565 11 Aug 14 nicklas 243     else
2565 11 Aug 14 nicklas 244     {
2565 11 Aug 14 nicklas 245       type = DataFileType.getById(dc, id);
2565 11 Aug 14 nicklas 246     }
2565 11 Aug 14 nicklas 247     return type;
2565 11 Aug 14 nicklas 248   }
2565 11 Aug 14 nicklas 249   
2565 11 Aug 14 nicklas 250   /**
2709 30 Sep 14 nicklas 251     Load the file type as a BASE item. Same as {@link #load(DbControl)} but return null
2709 30 Sep 14 nicklas 252     if no BASE item is found instead of throwing an exception.
2709 30 Sep 14 nicklas 253     @param dc The DbControl to use for database access
2709 30 Sep 14 nicklas 254     @return A DataFileType object
2709 30 Sep 14 nicklas 255   */
2709 30 Sep 14 nicklas 256   public DataFileType get(DbControl dc)
2709 30 Sep 14 nicklas 257   {
2709 30 Sep 14 nicklas 258     DataFileType type = null;
2709 30 Sep 14 nicklas 259     if (id == 0)
2709 30 Sep 14 nicklas 260     {
2709 30 Sep 14 nicklas 261       List<DataFileType> result = list(dc);
2709 30 Sep 14 nicklas 262       if (result.size() == 1)
2709 30 Sep 14 nicklas 263       {
2709 30 Sep 14 nicklas 264         type = result.get(0);
2709 30 Sep 14 nicklas 265         id = type.getId();
2709 30 Sep 14 nicklas 266       }
2709 30 Sep 14 nicklas 267     }
2709 30 Sep 14 nicklas 268     else
2709 30 Sep 14 nicklas 269     {
2709 30 Sep 14 nicklas 270       type = DataFileType.getById(dc, id);
2709 30 Sep 14 nicklas 271     }
2709 30 Sep 14 nicklas 272     return type;
2709 30 Sep 14 nicklas 273   }
2709 30 Sep 14 nicklas 274
2709 30 Sep 14 nicklas 275   
2709 30 Sep 14 nicklas 276   /**
2565 11 Aug 14 nicklas 277     List all file server registered in BASE with an name matching this 
2565 11 Aug 14 nicklas 278     definition. Normally, only a single file server should be returned.
2565 11 Aug 14 nicklas 279   */
2565 11 Aug 14 nicklas 280   public List<DataFileType> list(DbControl dc)
2565 11 Aug 14 nicklas 281   {
2565 11 Aug 14 nicklas 282     ItemQuery<DataFileType> query = DataFileType.getQuery();
2565 11 Aug 14 nicklas 283     query.restrict(
2565 11 Aug 14 nicklas 284       Restrictions.eq(
4669 02 Feb 18 nicklas 285         Hql.property("externalId"), 
4669 02 Feb 18 nicklas 286         Expressions.parameter("name", getExternalId(), Type.STRING)
2565 11 Aug 14 nicklas 287       ));
2565 11 Aug 14 nicklas 288     query.include(Include.ALL);
2565 11 Aug 14 nicklas 289     return query.list(dc);
2565 11 Aug 14 nicklas 290   }
2565 11 Aug 14 nicklas 291   
3935 13 May 16 nicklas 292   /**
3935 13 May 16 nicklas 293     Get the file of this file type that is attached to the given item.
3935 13 May 16 nicklas 294     @since 4.5
3935 13 May 16 nicklas 295   */
3935 13 May 16 nicklas 296   public File getFile(DbControl dc, FileStoreEnabled item)
3935 13 May 16 nicklas 297   {
3935 13 May 16 nicklas 298     if (!item.hasFileSet()) return null;
3935 13 May 16 nicklas 299     FileSetMember member = item.getFileSet().getMember(get(dc));
3935 13 May 16 nicklas 300     return member == null ? null : member.getFile();
3935 13 May 16 nicklas 301   }
5827 19 Feb 20 nicklas 302   
5827 19 Feb 20 nicklas 303   /**
5827 19 Feb 20 nicklas 304     Get all files of this type that are attached to the given
5827 19 Feb 20 nicklas 305     item.
5827 19 Feb 20 nicklas 306     @since 4.26
5827 19 Feb 20 nicklas 307   */
5827 19 Feb 20 nicklas 308   public List<File> getAllFiles(DbControl dc, FileStoreEnabled item)
5827 19 Feb 20 nicklas 309   {
5827 19 Feb 20 nicklas 310     if (!item.hasFileSet()) return Collections.emptyList();
5827 19 Feb 20 nicklas 311     ItemQuery<FileSetMember> query = item.getFileSet().getMembers(get(dc));
5827 19 Feb 20 nicklas 312     List<File> files = new ArrayList<>();
5827 19 Feb 20 nicklas 313     for (FileSetMember member : query.list(dc))
5827 19 Feb 20 nicklas 314     {
5827 19 Feb 20 nicklas 315       files.add(member.getFile());
5827 19 Feb 20 nicklas 316     }
5827 19 Feb 20 nicklas 317     return files;
5827 19 Feb 20 nicklas 318   }
2565 11 Aug 14 nicklas 319
4668 01 Feb 18 nicklas 320   /**
4668 01 Feb 18 nicklas 321     Get the file type information as a JSON object ready to be sent as an AJAX response.
4668 01 Feb 18 nicklas 322     @since 4.15
4668 01 Feb 18 nicklas 323   */
4668 01 Feb 18 nicklas 324   public JSONObject asJSONObject(DbControl dc)
4668 01 Feb 18 nicklas 325   {
4668 01 Feb 18 nicklas 326     if (json == null)
4668 01 Feb 18 nicklas 327     {
4668 01 Feb 18 nicklas 328       if (id==0) load(dc); // Ensure that the file type has been loaded
4668 01 Feb 18 nicklas 329       json = new JSONObject();
4668 01 Feb 18 nicklas 330       json.put("id", id);
4668 01 Feb 18 nicklas 331       json.put("name", getName());
4668 01 Feb 18 nicklas 332       json.put("itemType", getItemType().name());
4668 01 Feb 18 nicklas 333       json.put("externalId", getExternalId());
4668 01 Feb 18 nicklas 334       json.put("extension", getExtension());
4668 01 Feb 18 nicklas 335     }
4668 01 Feb 18 nicklas 336     return json;
4668 01 Feb 18 nicklas 337   }
4668 01 Feb 18 nicklas 338
2565 11 Aug 14 nicklas 339 }