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

Code
Comments
Other
Rev Date Author Line
1543 28 Feb 12 nicklas 1 package net.sf.basedb.reggie.dao;
1543 28 Feb 12 nicklas 2
1544 29 Feb 12 nicklas 3 import java.lang.reflect.Field;
1552 07 Mar 12 nicklas 4 import java.util.List;
1544 29 Feb 12 nicklas 5
5392 02 May 19 nicklas 6 import org.json.simple.JSONObject;
5392 02 May 19 nicklas 7
1543 28 Feb 12 nicklas 8 import net.sf.basedb.core.BioPlate;
1543 28 Feb 12 nicklas 9 import net.sf.basedb.core.BioPlateType;
1543 28 Feb 12 nicklas 10 import net.sf.basedb.core.BioWell.LockMode;
1543 28 Feb 12 nicklas 11 import net.sf.basedb.core.DbControl;
1552 07 Mar 12 nicklas 12 import net.sf.basedb.core.Include;
1610 23 Apr 12 nicklas 13 import net.sf.basedb.core.InvalidDataException;
1543 28 Feb 12 nicklas 14 import net.sf.basedb.core.Item;
1610 23 Apr 12 nicklas 15 import net.sf.basedb.core.ItemNotFoundException;
1543 28 Feb 12 nicklas 16 import net.sf.basedb.core.ItemQuery;
1552 07 Mar 12 nicklas 17 import net.sf.basedb.core.PlateGeometry;
1543 28 Feb 12 nicklas 18 import net.sf.basedb.core.Type;
1543 28 Feb 12 nicklas 19 import net.sf.basedb.core.query.Expressions;
1543 28 Feb 12 nicklas 20 import net.sf.basedb.core.query.Hql;
3309 06 May 15 nicklas 21 import net.sf.basedb.core.query.Restriction;
1543 28 Feb 12 nicklas 22 import net.sf.basedb.core.query.Restrictions;
1543 28 Feb 12 nicklas 23
1543 28 Feb 12 nicklas 24 /**
1543 28 Feb 12 nicklas 25   Used to define a bioplate types by name and main item type and item subtype.
1543 28 Feb 12 nicklas 26   
1543 28 Feb 12 nicklas 27   @author nicklas
1543 28 Feb 12 nicklas 28   @since 2.4
1543 28 Feb 12 nicklas 29 */
1543 28 Feb 12 nicklas 30 public class BioplateType 
1543 28 Feb 12 nicklas 31 {
1543 28 Feb 12 nicklas 32
1543 28 Feb 12 nicklas 33   /**
3640 02 Dec 15 nicklas 34     Definition of a storage box. The "Sp" boxes are used a template. "Lys", "DNA", "RNA" and "FT" boxes
3640 02 Dec 15 nicklas 35     are using the same plate type.
3640 02 Dec 15 nicklas 36     @since 4.0
3640 02 Dec 15 nicklas 37   */
3640 02 Dec 15 nicklas 38   public static final BioplateType STORAGE_BOX =
3640 02 Dec 15 nicklas 39     new BioplateType("Storage plate", null, null, LockMode.UNLOCKED, Geometry.NINE_BY_NINE, "Sp", 3);
3640 02 Dec 15 nicklas 40
3640 02 Dec 15 nicklas 41   /**
1543 28 Feb 12 nicklas 42     The definition of the "Bioanalyzer RNA Quality control" plate type.
1543 28 Feb 12 nicklas 43   */
1543 28 Feb 12 nicklas 44   public static final BioplateType BA_RNAQC = 
1606 19 Apr 12 nicklas 45     new BioplateType("Bioanalyzer RNAQC reaction plate", Item.EXTRACT, Subtype.RNAQC, LockMode.LOCKED_AFTER_ADD, Geometry.ONE_BY_TWELVE, "BAPlate", 4);
1543 28 Feb 12 nicklas 46
1543 28 Feb 12 nicklas 47   /**
1543 28 Feb 12 nicklas 48     The definition of the "Caliper RNA Quality control" plate type.
1543 28 Feb 12 nicklas 49   */
1543 28 Feb 12 nicklas 50   public static final BioplateType CALIPER_RNAQC = 
1606 19 Apr 12 nicklas 51     new BioplateType("Caliper RNAQC reaction plate", Item.EXTRACT, Subtype.RNAQC, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "CaliperPlate", 4);
1543 28 Feb 12 nicklas 52
1606 19 Apr 12 nicklas 53   /**
5482 11 Jun 19 nicklas 54     The definition of the "NormDNA" plate type.
5361 15 Apr 19 nicklas 55     @since 4.23
5361 15 Apr 19 nicklas 56   */
5361 15 Apr 19 nicklas 57   public static final BioplateType PRE_NORMALIZED_DNA = 
5482 11 Jun 19 nicklas 58     new BioplateType("PreNormalizedDNA plate", Item.EXTRACT, Subtype.DNA_NORMALIZED_ALIQUOT, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "NormDNA", 4);
5361 15 Apr 19 nicklas 59
5361 15 Apr 19 nicklas 60   
5361 15 Apr 19 nicklas 61   /**
1606 19 Apr 12 nicklas 62     The definition of the "Paraffin block" plate type.
1666 23 May 12 nicklas 63     @since 2.7
1606 19 Apr 12 nicklas 64   */
1606 19 Apr 12 nicklas 65   public static final BioplateType PARAFFIN_BLOCK = 
1685 04 Jun 12 nicklas 66     new BioplateType("FFPE block", Item.SAMPLE, Subtype.HISTOLOGY, LockMode.LOCKED_AFTER_ADD, Geometry.THREE_BY_TWO, "PB", 5);
1606 19 Apr 12 nicklas 67   
1606 19 Apr 12 nicklas 68   /**
1685 04 Jun 12 nicklas 69     The definition of the "HE stain glass" plate type. It is locked to samples
1668 25 May 12 nicklas 70     of subtype {@link Subtype#STAINED}.
1668 25 May 12 nicklas 71     @since 2.7
1668 25 May 12 nicklas 72   */
1668 25 May 12 nicklas 73   public static final BioplateType HE_GLASS = 
1685 04 Jun 12 nicklas 74     new BioplateType("HE stain glass", Item.SAMPLE, Subtype.STAINED, LockMode.LOCKED_AFTER_ADD, Geometry.THREE_BY_TWO, "HE", 5);
1668 25 May 12 nicklas 75
1865 19 Feb 13 nicklas 76   /**
1865 19 Feb 13 nicklas 77     The definition of the "mRNA reaction plate" type. It is locked to extracts
1865 19 Feb 13 nicklas 78     of subtype {@link Subtype#MRNA} and uses 8x12 geometry.
1867 19 Feb 13 nicklas 79     @since 2.12
1865 19 Feb 13 nicklas 80   */
1865 19 Feb 13 nicklas 81   public static final BioplateType MRNA =
1899 07 Mar 13 nicklas 82     new BioplateType("mRNA reaction plate", Item.EXTRACT, Subtype.MRNA, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "MRnaPlate", 4);
1865 19 Feb 13 nicklas 83
1865 19 Feb 13 nicklas 84   /**
1865 19 Feb 13 nicklas 85     The definition of the "cDNA reaction plate" type. It is locked to extracts
1865 19 Feb 13 nicklas 86     of subtype {@link Subtype#CDNA} and uses 8x12 geometry.
1867 19 Feb 13 nicklas 87     @since 2.12
1865 19 Feb 13 nicklas 88   */
1865 19 Feb 13 nicklas 89   public static final BioplateType CDNA =
1899 07 Mar 13 nicklas 90       new BioplateType("cDNA reaction plate", Item.EXTRACT, Subtype.CDNA, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "CDnaPlate", 4);
1668 25 May 12 nicklas 91   
1668 25 May 12 nicklas 92   /**
1893 04 Mar 13 nicklas 93     The definition of the "Library plate" type. It is locked to extracts
1893 04 Mar 13 nicklas 94     of subtype {@link Subtype#LIBRARY} and uses 8x12 geometry.
1893 04 Mar 13 nicklas 95     @since 2.12
1893 04 Mar 13 nicklas 96   */
1893 04 Mar 13 nicklas 97   public static final BioplateType LIBRARY =
1899 07 Mar 13 nicklas 98     new BioplateType("Library plate", Item.EXTRACT, Subtype.LIBRARY, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "LibPlate", 4);
1893 04 Mar 13 nicklas 99
1893 04 Mar 13 nicklas 100   /**
3284 29 Apr 15 nicklas 101     The definition of the "NeoPrep plate" type. It is locked to extracts
3284 29 Apr 15 nicklas 102     of subtype {@link Subtype#LIBRARY} and uses 8x2 geometry.
3284 29 Apr 15 nicklas 103     @since 3.4
3284 29 Apr 15 nicklas 104   */
3284 29 Apr 15 nicklas 105   public static final BioplateType NEOPREP =
3284 29 Apr 15 nicklas 106     new BioplateType("NeoPrep plate", Item.EXTRACT, Subtype.LIBRARY, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWO, "NeoPrepPlate", 4);
3284 29 Apr 15 nicklas 107
5867 18 Mar 20 nicklas 108   
5390 29 Apr 19 nicklas 109   /**
5867 18 Mar 20 nicklas 110     The definition of the "External library plate" type. It is locked to extracts
6474 04 Nov 21 nicklas 111     of subtype {@link Subtype#LIBRARY} and uses 8x12 geometry.
5867 18 Mar 20 nicklas 112     @since 2.12
5867 18 Mar 20 nicklas 113   */
5867 18 Mar 20 nicklas 114   public static final BioplateType EXTERNAL_LIBRARY =
5867 18 Mar 20 nicklas 115     new BioplateType("External library plate", Item.EXTRACT, Subtype.LIBRARY, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "ExternalLibPlate", 4);
6474 04 Nov 21 nicklas 116   
5867 18 Mar 20 nicklas 117   /**
6474 04 Nov 21 nicklas 118     The definition of the "External library strip" type. It is locked to extracts
6474 04 Nov 21 nicklas 119     of subtype {@link Subtype#LIBRARY} and uses 1x8 geometry.
6474 04 Nov 21 nicklas 120     @since 4.33.4
6474 04 Nov 21 nicklas 121   */
6474 04 Nov 21 nicklas 122   public static final BioplateType EXTERNAL_LIBRARY_STRIP =
6474 04 Nov 21 nicklas 123     new BioplateType("External library strip", Item.EXTRACT, Subtype.LIBRARY, LockMode.LOCKED_AFTER_ADD, Geometry.ONE_BY_EIGHT, "ExternalLibStrip", 5);
6474 04 Nov 21 nicklas 124
6474 04 Nov 21 nicklas 125   
6474 04 Nov 21 nicklas 126   /**
5390 29 Apr 19 nicklas 127     The definition of the "MIPs plate" type. It is locked to extracts
5390 29 Apr 19 nicklas 128     of subtype {@link Subtype#LIBRARY} and uses 8x12 geometry.
5390 29 Apr 19 nicklas 129     @since 4.23
5390 29 Apr 19 nicklas 130   */
5390 29 Apr 19 nicklas 131   public static final BioplateType MIPS =
5390 29 Apr 19 nicklas 132     new BioplateType("MIPs plate", Item.EXTRACT, Subtype.LIBRARY, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "MIPsPlate", 4);
3284 29 Apr 15 nicklas 133
3284 29 Apr 15 nicklas 134   /**
5429 16 May 19 nicklas 135     Plate type for barcode templates. An actual instance of this type holds virtual biomaterial items
5429 16 May 19 nicklas 136     with a barcode that is copied to actual libraries on the same coordinate of a target plate.
5429 16 May 19 nicklas 137     @since 4.23
5429 16 May 19 nicklas 138   */
5429 16 May 19 nicklas 139   public static final BioplateType BARCODE_TEMPLATE =
5429 16 May 19 nicklas 140     new BioplateType("BarcodeTemplate", Item.EXTRACT, null, LockMode.LOCKED_AFTER_ADD, Geometry.EIGHT_BY_TWELVE, "BarcodeTemplate", 2);
5429 16 May 19 nicklas 141   
5429 16 May 19 nicklas 142   /**
1544 29 Feb 12 nicklas 143     Get the bioplate type by name of the static constant defined in this class.
1544 29 Feb 12 nicklas 144     
1552 07 Mar 12 nicklas 145     @param cName The name of the static constant
1544 29 Feb 12 nicklas 146     @return A bioplate type object or null if not found
1544 29 Feb 12 nicklas 147    */
1544 29 Feb 12 nicklas 148   public static BioplateType getByCName(String cName)
1544 29 Feb 12 nicklas 149   {
1544 29 Feb 12 nicklas 150     if (cName == null) return null;
1544 29 Feb 12 nicklas 151     BioplateType bioplateType = null;
1544 29 Feb 12 nicklas 152     try
1544 29 Feb 12 nicklas 153     {
1544 29 Feb 12 nicklas 154       Field f = BioplateType.class.getDeclaredField(cName);
1544 29 Feb 12 nicklas 155       bioplateType = (BioplateType)f.get(null);
1544 29 Feb 12 nicklas 156     }
1544 29 Feb 12 nicklas 157     catch (NoSuchFieldException ex)
1544 29 Feb 12 nicklas 158     {}
1544 29 Feb 12 nicklas 159     catch (IllegalAccessException ex)
1544 29 Feb 12 nicklas 160     {}
1544 29 Feb 12 nicklas 161     catch (ClassCastException ex)
1544 29 Feb 12 nicklas 162     {}
1544 29 Feb 12 nicklas 163     return bioplateType;
1544 29 Feb 12 nicklas 164   }
1544 29 Feb 12 nicklas 165
1544 29 Feb 12 nicklas 166   
1543 28 Feb 12 nicklas 167   private final String name;
1543 28 Feb 12 nicklas 168   private final Item bioMaterialType;
1543 28 Feb 12 nicklas 169   private final Subtype subtype;
1543 28 Feb 12 nicklas 170   private final LockMode lockMode;
1606 19 Apr 12 nicklas 171   private final Geometry geometry;
1552 07 Mar 12 nicklas 172   private final String plateNamePrefix;
1606 19 Apr 12 nicklas 173   private final int numDigitsInName;
1543 28 Feb 12 nicklas 174   private int id;
1552 07 Mar 12 nicklas 175   private int geometryId;
5392 02 May 19 nicklas 176   private JSONObject json;
1543 28 Feb 12 nicklas 177   
1543 28 Feb 12 nicklas 178   /**
1543 28 Feb 12 nicklas 179     Create a new definition
1543 28 Feb 12 nicklas 180     @param name The name of the subtype
1543 28 Feb 12 nicklas 181     @param bioMaterialType The type of biomaterial that can be placed on the bioplate 
1543 28 Feb 12 nicklas 182     @param subtype The subtype of biomaterial that can be placed on the bioplate
1543 28 Feb 12 nicklas 183   */
1606 19 Apr 12 nicklas 184   private BioplateType(String name, Item bioMaterialType, Subtype subtype, LockMode lockMode, Geometry geometry, String plateNamePrefix, int numDigitsInName)
1543 28 Feb 12 nicklas 185   {
1543 28 Feb 12 nicklas 186     this.name = name;
1543 28 Feb 12 nicklas 187     this.bioMaterialType = bioMaterialType;
1543 28 Feb 12 nicklas 188     this.subtype = subtype;
1543 28 Feb 12 nicklas 189     this.lockMode = lockMode;
1606 19 Apr 12 nicklas 190     this.geometry = geometry;
1552 07 Mar 12 nicklas 191     this.plateNamePrefix = plateNamePrefix;
1606 19 Apr 12 nicklas 192     this.numDigitsInName = numDigitsInName;
1543 28 Feb 12 nicklas 193   }
1543 28 Feb 12 nicklas 194     
1543 28 Feb 12 nicklas 195   /**
1668 25 May 12 nicklas 196     Get the name of the plate type.
1543 28 Feb 12 nicklas 197   */
1543 28 Feb 12 nicklas 198   public String getName()
1543 28 Feb 12 nicklas 199   {
1543 28 Feb 12 nicklas 200     return name;
1543 28 Feb 12 nicklas 201   }
1543 28 Feb 12 nicklas 202   
1543 28 Feb 12 nicklas 203   /**
1543 28 Feb 12 nicklas 204     Get the biomaterial item type that can be used on the plate.
1543 28 Feb 12 nicklas 205   */
1543 28 Feb 12 nicklas 206   public Item getBioMaterialType()
1543 28 Feb 12 nicklas 207   {
1543 28 Feb 12 nicklas 208     return bioMaterialType;
1543 28 Feb 12 nicklas 209   }
1543 28 Feb 12 nicklas 210   
1543 28 Feb 12 nicklas 211   /**
1543 28 Feb 12 nicklas 212     Get the biomaterial subtype that can be used on the plate.
1543 28 Feb 12 nicklas 213     Null if no restriction.
1543 28 Feb 12 nicklas 214   */
1543 28 Feb 12 nicklas 215   public Subtype getSubtype()
1543 28 Feb 12 nicklas 216   {
1543 28 Feb 12 nicklas 217     return subtype;
1543 28 Feb 12 nicklas 218   }
1543 28 Feb 12 nicklas 219   
1543 28 Feb 12 nicklas 220   /**
1668 25 May 12 nicklas 221     Get the prefix that is used when creating new plates of this plate 
1668 25 May 12 nicklas 222     type.
1668 25 May 12 nicklas 223     @since 2.7
1668 25 May 12 nicklas 224   */
1668 25 May 12 nicklas 225   public String getPlateNamePrefix()
1668 25 May 12 nicklas 226   {
1668 25 May 12 nicklas 227     return plateNamePrefix;
1668 25 May 12 nicklas 228   }
1668 25 May 12 nicklas 229   
1668 25 May 12 nicklas 230   /**
1543 28 Feb 12 nicklas 231     Get the lock mode for wells.
1543 28 Feb 12 nicklas 232   */
1543 28 Feb 12 nicklas 233   public LockMode getLockMode()
1543 28 Feb 12 nicklas 234   {
1543 28 Feb 12 nicklas 235     return lockMode;
1543 28 Feb 12 nicklas 236   }
1543 28 Feb 12 nicklas 237   
1543 28 Feb 12 nicklas 238   /**
1543 28 Feb 12 nicklas 239     Load the subtype as a BASE item.
1543 28 Feb 12 nicklas 240     @param dc The DbControl to use for database access
1543 28 Feb 12 nicklas 241     @return An ItemSubtype object
1543 28 Feb 12 nicklas 242   */
1543 28 Feb 12 nicklas 243   public BioPlateType load(DbControl dc)
1543 28 Feb 12 nicklas 244   {
1543 28 Feb 12 nicklas 245     BioPlateType plateType = null;
1543 28 Feb 12 nicklas 246     if (id == 0)
1543 28 Feb 12 nicklas 247     {
1610 23 Apr 12 nicklas 248       List<BioPlateType> result = list(dc);
1610 23 Apr 12 nicklas 249       if (result.size() == 0)
1610 23 Apr 12 nicklas 250       {
1610 23 Apr 12 nicklas 251         throw new ItemNotFoundException("BioPlateType["+getName()+"]");
1610 23 Apr 12 nicklas 252       }
1610 23 Apr 12 nicklas 253       else if (result.size() > 1)
1610 23 Apr 12 nicklas 254       {
1610 23 Apr 12 nicklas 255         throw new InvalidDataException("Found > 1 BioPlateType["+getName()+"]");
1610 23 Apr 12 nicklas 256       }
1610 23 Apr 12 nicklas 257       plateType = result.get(0);
1543 28 Feb 12 nicklas 258       id = plateType.getId();
1543 28 Feb 12 nicklas 259     }
1543 28 Feb 12 nicklas 260     else
1543 28 Feb 12 nicklas 261     {
1543 28 Feb 12 nicklas 262       plateType = BioPlateType.getById(dc, id);
1543 28 Feb 12 nicklas 263     }
1543 28 Feb 12 nicklas 264     return plateType;
1543 28 Feb 12 nicklas 265   }
1543 28 Feb 12 nicklas 266   
1543 28 Feb 12 nicklas 267   /**
6049 12 Nov 20 nicklas 268     Load the plate type as a BASE item. Same as {@link #load(DbControl)} but return null
6049 12 Nov 20 nicklas 269     if no BASE item is found instead of throwing an exception.
6049 12 Nov 20 nicklas 270     @param dc The DbControl to use for database access
6049 12 Nov 20 nicklas 271     @return An BioPlateType object
6049 12 Nov 20 nicklas 272     @since 4.28
6049 12 Nov 20 nicklas 273   */
6049 12 Nov 20 nicklas 274   public BioPlateType get(DbControl dc)
6049 12 Nov 20 nicklas 275   {
6049 12 Nov 20 nicklas 276     BioPlateType plateType = null;
6049 12 Nov 20 nicklas 277     if (id == 0)
6049 12 Nov 20 nicklas 278     {
6049 12 Nov 20 nicklas 279       List<BioPlateType> result = list(dc);
6049 12 Nov 20 nicklas 280       if (result.size() == 1)
6049 12 Nov 20 nicklas 281       {
6049 12 Nov 20 nicklas 282         plateType = result.get(0);
6049 12 Nov 20 nicklas 283         id = plateType.getId();
6049 12 Nov 20 nicklas 284       }
6049 12 Nov 20 nicklas 285     }
6049 12 Nov 20 nicklas 286     else
6049 12 Nov 20 nicklas 287     {
6049 12 Nov 20 nicklas 288       plateType = BioPlateType.getById(dc, id);
6049 12 Nov 20 nicklas 289     }
6049 12 Nov 20 nicklas 290     return plateType;
6049 12 Nov 20 nicklas 291     
6049 12 Nov 20 nicklas 292   }
6049 12 Nov 20 nicklas 293
6049 12 Nov 20 nicklas 294   /**
1610 23 Apr 12 nicklas 295     List all bioplate types registered in BASE with a name matching this bioplate type
1610 23 Apr 12 nicklas 296     definition. Normally, only a single bioplate type should be returned.
1610 23 Apr 12 nicklas 297   */
1610 23 Apr 12 nicklas 298   public List<BioPlateType> list(DbControl dc)
1610 23 Apr 12 nicklas 299   {
1610 23 Apr 12 nicklas 300     ItemQuery<BioPlateType> query = BioPlateType.getQuery();
1610 23 Apr 12 nicklas 301     query.restrict(
1610 23 Apr 12 nicklas 302       Restrictions.eq(
1610 23 Apr 12 nicklas 303         Hql.property("name"), 
1610 23 Apr 12 nicklas 304         Expressions.parameter("name", getName(), Type.STRING)
1610 23 Apr 12 nicklas 305       ));
1610 23 Apr 12 nicklas 306     query.include(Include.ALL);
1610 23 Apr 12 nicklas 307     return query.list(dc);
1610 23 Apr 12 nicklas 308   }
1610 23 Apr 12 nicklas 309   
1610 23 Apr 12 nicklas 310   /**
1552 07 Mar 12 nicklas 311     Get the plate geometry this bioplate type normally uses.
1552 07 Mar 12 nicklas 312   */
1552 07 Mar 12 nicklas 313   public PlateGeometry getPlateGeometry(DbControl dc)
1552 07 Mar 12 nicklas 314   {
1606 19 Apr 12 nicklas 315     return geometry.load(dc);
1552 07 Mar 12 nicklas 316   }
1552 07 Mar 12 nicklas 317   
1552 07 Mar 12 nicklas 318   /**
1552 07 Mar 12 nicklas 319     Generate the next auto-generated bioplate name. This method will search all bioplates
4888 05 Jul 18 nicklas 320     starting with the plate type's prefix and find the one with the highest numeric suffix.
4888 05 Jul 18 nicklas 321     The returned name is the found plate + 1, but see also
4888 05 Jul 18 nicklas 322     {@link ReggieItem#getNextItemNames(DbControl, int, ItemQuery, String, int, boolean)}
4888 05 Jul 18 nicklas 323     for more information about name reservation.
4888 05 Jul 18 nicklas 324     @since 4.19
4888 05 Jul 18 nicklas 325   */
4888 05 Jul 18 nicklas 326   public String getNextPlateName(DbControl dc, boolean releaseIfTransactionFails)
4888 05 Jul 18 nicklas 327   {
4888 05 Jul 18 nicklas 328     ItemQuery<BioPlate> query = BioPlate.getQuery();
4888 05 Jul 18 nicklas 329     addFilter(dc, query, false);
4888 05 Jul 18 nicklas 330     query.include(Include.ALL);
4888 05 Jul 18 nicklas 331     return ReggieItem.getNextItemName(dc, query, plateNamePrefix, numDigitsInName, releaseIfTransactionFails);
4888 05 Jul 18 nicklas 332   }
4888 05 Jul 18 nicklas 333
4888 05 Jul 18 nicklas 334   /**
1543 28 Feb 12 nicklas 335     Add a filter restriction the given bioplate query so that it
1543 28 Feb 12 nicklas 336     only return plates of this type.
1543 28 Feb 12 nicklas 337     
1543 28 Feb 12 nicklas 338     @param query The query to filter
1543 28 Feb 12 nicklas 339     @param excludeDestroyed If set, an additional filter is added so that only
1543 28 Feb 12 nicklas 340       non-destroyed bioplates are returned
1543 28 Feb 12 nicklas 341   */
1543 28 Feb 12 nicklas 342   public void addFilter(DbControl dc, ItemQuery<? extends BioPlate> query, boolean excludeDestroyed)
1543 28 Feb 12 nicklas 343   {
1543 28 Feb 12 nicklas 344     addFilter(dc, query, null, excludeDestroyed);
1543 28 Feb 12 nicklas 345   }
1543 28 Feb 12 nicklas 346
1543 28 Feb 12 nicklas 347   /**
1543 28 Feb 12 nicklas 348     Add a filter restriction to the given query based on the 
1543 28 Feb 12 nicklas 349     given subtype. If no alias is specified, the filter is
1543 28 Feb 12 nicklas 350     applied to the root item, otherwise it is applied
1543 28 Feb 12 nicklas 351     to the alias of a joined (eg. parent or child) item
1543 28 Feb 12 nicklas 352     
1543 28 Feb 12 nicklas 353     @param query The query to restrict
1543 28 Feb 12 nicklas 354     @param alias Specify an alias if the filter should be
1543 28 Feb 12 nicklas 355       placed on a joined (eg. child or parent) item instead
1543 28 Feb 12 nicklas 356       of the root item
1543 28 Feb 12 nicklas 357   */
1606 19 Apr 12 nicklas 358   public void addFilter(DbControl dc, ItemQuery<?> query, String alias, boolean excludeDestroyed)
1543 28 Feb 12 nicklas 359   {
3309 06 May 15 nicklas 360     query.restrict(restriction(dc, alias));
1543 28 Feb 12 nicklas 361     if (excludeDestroyed)
1543 28 Feb 12 nicklas 362     {
1543 28 Feb 12 nicklas 363       query.restrict(Restrictions.eq(Hql.property(alias, "destroyed"), Expressions.parameter("destroyed", false, Type.BOOLEAN)));
1543 28 Feb 12 nicklas 364     }
1543 28 Feb 12 nicklas 365   }
1543 28 Feb 12 nicklas 366   
3309 06 May 15 nicklas 367   /**
3309 06 May 15 nicklas 368     Create a restriction for returning only bioplates of this type.
3309 06 May 15 nicklas 369     @since 3.4
3309 06 May 15 nicklas 370   */
3309 06 May 15 nicklas 371   public Restriction restriction(DbControl dc, String alias)
3309 06 May 15 nicklas 372   {
3309 06 May 15 nicklas 373     if (id==0) load(dc); // Ensure that the subtype has been loaded
3309 06 May 15 nicklas 374     return Restrictions.eq(Hql.property(alias, "bioPlateType"), Expressions.integer(id));
3309 06 May 15 nicklas 375   }
5392 02 May 19 nicklas 376   
5392 02 May 19 nicklas 377   /**
5392 02 May 19 nicklas 378     Get the file type information as a JSON object ready to be sent as an AJAX response.
5392 02 May 19 nicklas 379     @since 4.23
5392 02 May 19 nicklas 380   */
5392 02 May 19 nicklas 381   public JSONObject asJSONObject(DbControl dc)
5392 02 May 19 nicklas 382   {
5392 02 May 19 nicklas 383     if (json == null)
5392 02 May 19 nicklas 384     {
5392 02 May 19 nicklas 385       if (id==0) load(dc); // Ensure that the file type has been loaded
5392 02 May 19 nicklas 386       json = new JSONObject();
5392 02 May 19 nicklas 387       json.put("id", id);
5392 02 May 19 nicklas 388       json.put("name", getName());
5392 02 May 19 nicklas 389       json.put("bioMaterialType", getBioMaterialType().name());
5392 02 May 19 nicklas 390       json.put("subtype", getSubtype().asJSONObject(dc));
5392 02 May 19 nicklas 391     }
5392 02 May 19 nicklas 392     return json;
5392 02 May 19 nicklas 393   }
3309 06 May 15 nicklas 394
1543 28 Feb 12 nicklas 395 }