extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/dao/Subtype.java

Code
Comments
Other
Rev Date Author Line
2933 14 Nov 14 olle 1 package net.sf.basedb.meludi.dao;
2933 14 Nov 14 olle 2
2933 14 Nov 14 olle 3 import java.lang.reflect.Field;
2933 14 Nov 14 olle 4 import java.util.List;
2933 14 Nov 14 olle 5
2933 14 Nov 14 olle 6 import org.json.simple.JSONObject;
2933 14 Nov 14 olle 7
3449 28 Jul 15 olle 8 import net.sf.basedb.core.BasicItem;
2933 14 Nov 14 olle 9 import net.sf.basedb.core.DbControl;
2933 14 Nov 14 olle 10 import net.sf.basedb.core.Include;
2933 14 Nov 14 olle 11 import net.sf.basedb.core.InvalidDataException;
2933 14 Nov 14 olle 12 import net.sf.basedb.core.Item;
2933 14 Nov 14 olle 13 import net.sf.basedb.core.ItemNotFoundException;
2933 14 Nov 14 olle 14 import net.sf.basedb.core.ItemQuery;
2933 14 Nov 14 olle 15 import net.sf.basedb.core.ItemSubtype;
3449 28 Jul 15 olle 16 import net.sf.basedb.core.Project;
2933 14 Nov 14 olle 17 import net.sf.basedb.core.Subtypable;
2933 14 Nov 14 olle 18 import net.sf.basedb.core.Type;
2933 14 Nov 14 olle 19 import net.sf.basedb.core.query.Expressions;
2933 14 Nov 14 olle 20 import net.sf.basedb.core.query.Hql;
2933 14 Nov 14 olle 21 import net.sf.basedb.core.query.Restriction;
2933 14 Nov 14 olle 22 import net.sf.basedb.core.query.Restrictions;
2933 14 Nov 14 olle 23
2933 14 Nov 14 olle 24 /**
2933 14 Nov 14 olle 25   Used to define a subtype by name and main item type.
2933 14 Nov 14 olle 26   
2933 14 Nov 14 olle 27   @author nicklas
2933 14 Nov 14 olle 28   @since 2.0
2933 14 Nov 14 olle 29 */
2933 14 Nov 14 olle 30 public class Subtype 
2933 14 Nov 14 olle 31 {
2933 14 Nov 14 olle 32
2933 14 Nov 14 olle 33   /**
2933 14 Nov 14 olle 34     The definition of the "Patient" subtype.
3180 17 Mar 15 olle 35     @since 1.0
2933 14 Nov 14 olle 36   */
3449 28 Jul 15 olle 37   public static final Subtype PATIENT = new Subtype("Patient", null, Item.BIOSOURCE, false);
2933 14 Nov 14 olle 38
2933 14 Nov 14 olle 39   /**
4785 27 Apr 18 olle 40     The definition of the "No" subtype (for virtual patient with consent=No).
4785 27 Apr 18 olle 41     @since 1.6
4785 27 Apr 18 olle 42   */
4785 27 Apr 18 olle 43   public static final Subtype NO = new Subtype("No", null, Item.BIOSOURCE, false);
4785 27 Apr 18 olle 44
4785 27 Apr 18 olle 45   /**
4785 27 Apr 18 olle 46     The definition of the "Not asked" subtype (for virtual patient with consent=Not asked).
4785 27 Apr 18 olle 47     @since 1.6
4785 27 Apr 18 olle 48   */
4785 27 Apr 18 olle 49   public static final Subtype NOT_ASKED = new Subtype("Not asked", null, Item.BIOSOURCE, false);
4785 27 Apr 18 olle 50
4785 27 Apr 18 olle 51   /**
4785 27 Apr 18 olle 52     The definition of the "Retract" subtype (for virtual patient with retracted "Yes"-consent).
4785 27 Apr 18 olle 53     @since 1.6
4785 27 Apr 18 olle 54   */
4785 27 Apr 18 olle 55   public static final Subtype RETRACT = new Subtype("Retract", null, Item.BIOSOURCE, false);
4785 27 Apr 18 olle 56
4785 27 Apr 18 olle 57   /**
4785 27 Apr 18 olle 58     The definition of the "RetroNo" subtype (for virtual patient with consent "No" or missing).
4785 27 Apr 18 olle 59     @since 1.6
4785 27 Apr 18 olle 60   */
4785 27 Apr 18 olle 61   public static final Subtype RETRO_NO = new Subtype("RetroNo", null, Item.BIOSOURCE, false);
4785 27 Apr 18 olle 62
4785 27 Apr 18 olle 63   /**
2933 14 Nov 14 olle 64     The definition of the "Case" subtype.
3180 17 Mar 15 olle 65     @since 1.0
2933 14 Nov 14 olle 66   */
3449 28 Jul 15 olle 67   public static final Subtype CASE = new Subtype("Case", null, Item.SAMPLE, false);
2933 14 Nov 14 olle 68
2933 14 Nov 14 olle 69   /**
4795 08 May 18 olle 70     The definition of the "Blood" subtype.
4795 08 May 18 olle 71     @since 1.6
4795 08 May 18 olle 72   */
4795 08 May 18 olle 73   public static final Subtype BLOOD = new Subtype("Blood", "b", Item.SAMPLE, false);
4795 08 May 18 olle 74
4795 08 May 18 olle 75   /**
4795 08 May 18 olle 76     The definition of the "BloodDNA" subtype.
4795 08 May 18 olle 77     @since 1.6
4795 08 May 18 olle 78    */
4795 08 May 18 olle 79   public static final Subtype BLOOD_DNA = new Subtype("BloodDNA", "d", Item.EXTRACT, false);
4795 08 May 18 olle 80
4795 08 May 18 olle 81   /**
4968 05 Sep 18 olle 82     The definition of the "FFPEBlock" subtype.
4903 10 Jul 18 olle 83     @since 1.6
4903 10 Jul 18 olle 84   */
4968 05 Sep 18 olle 85   public static final Subtype FFPE_BLOCK = new Subtype("FFPEBlock", "fb", Item.SAMPLE, false);
4903 10 Jul 18 olle 86
4903 10 Jul 18 olle 87   /**
2933 14 Nov 14 olle 88     The definition of the "Specimen" subtype.
3180 17 Mar 15 olle 89     @since 1.0
2933 14 Nov 14 olle 90   */
3449 28 Jul 15 olle 91   public static final Subtype SPECIMEN = new Subtype("Specimen", null, Item.SAMPLE, false);
2933 14 Nov 14 olle 92
2933 14 Nov 14 olle 93   /**
5093 14 Nov 18 olle 94     The definition of the "Histology" subtype.
5093 14 Nov 18 olle 95     @since 1.6.0
5093 14 Nov 18 olle 96   */
5093 14 Nov 18 olle 97   public static final Subtype HISTOLOGY = new Subtype("Histology", null, Item.SAMPLE, false);
5093 14 Nov 18 olle 98
5093 14 Nov 18 olle 99   /**
5111 20 Nov 18 olle 100     The definition of the "Stained" subtype.
5111 20 Nov 18 olle 101     @since 1.6.0
5111 20 Nov 18 olle 102   */
5111 20 Nov 18 olle 103   public static final Subtype STAINED = new Subtype("Stained", null, Item.SAMPLE, false);
5111 20 Nov 18 olle 104
5111 20 Nov 18 olle 105   /**
2933 14 Nov 14 olle 106     The definition of the "DNA" extract subtype.
3180 17 Mar 15 olle 107     @since 1.0
2933 14 Nov 14 olle 108   */
3449 28 Jul 15 olle 109   public static final Subtype DNA = new Subtype("DNA", "d", Item.EXTRACT, false);
2933 14 Nov 14 olle 110
2933 14 Nov 14 olle 111   /**
2933 14 Nov 14 olle 112     The definition of the "RNA" extract subtype.
3180 17 Mar 15 olle 113     @since 1.0
2933 14 Nov 14 olle 114   */
3449 28 Jul 15 olle 115   public static final Subtype RNA = new Subtype("RNA", "r", Item.EXTRACT, false);
2933 14 Nov 14 olle 116
2933 14 Nov 14 olle 117   /**
2933 14 Nov 14 olle 118     The definition of the "RNA Quality control" extract subtype.
2933 14 Nov 14 olle 119     @since 2.4
2933 14 Nov 14 olle 120   */
3449 28 Jul 15 olle 121   //public static final Subtype RNAQC = new Subtype("RNAQC", "qc", Item.EXTRACT, true);
2933 14 Nov 14 olle 122
2933 14 Nov 14 olle 123   
2933 14 Nov 14 olle 124   /**
2933 14 Nov 14 olle 125     The definition of the "Quality control" protocol subtype.
2933 14 Nov 14 olle 126     @since 2.4
2933 14 Nov 14 olle 127   */
3449 28 Jul 15 olle 128   //public static final Subtype QUALITY_CONTROL = new Subtype("Quality control", null, Item.PROTOCOL, false);
2933 14 Nov 14 olle 129   
2933 14 Nov 14 olle 130   /**
2933 14 Nov 14 olle 131     The definition of the "Sample handling" protocol subtype (used to create
2933 14 Nov 14 olle 132     Lysate items).
2933 14 Nov 14 olle 133     @since 2.6
2933 14 Nov 14 olle 134   */
3449 28 Jul 15 olle 135   //public static final Subtype SAMPLE_HANDLING_PROTOCOL = new Subtype("Sample handling", null, Item.PROTOCOL, false);
2933 14 Nov 14 olle 136   
2933 14 Nov 14 olle 137   /**
2933 14 Nov 14 olle 138     The definition of the "Extract" protocol subtype (used to create
2933 14 Nov 14 olle 139     other extract items). This should have been installed by BASE.
2933 14 Nov 14 olle 140     @since 2.6
2933 14 Nov 14 olle 141   */
3449 28 Jul 15 olle 142   public static final Subtype EXTRACTION_PROTOCOL = new Subtype("Extraction", null, Item.PROTOCOL, false);
2933 14 Nov 14 olle 143
2933 14 Nov 14 olle 144   /**
2933 14 Nov 14 olle 145     The definition of the "mRNA" extract subtype.
2933 14 Nov 14 olle 146     @since 2.12
2933 14 Nov 14 olle 147   */
3449 28 Jul 15 olle 148   //public static final Subtype MRNA = new Subtype("mRNA", "m", Item.EXTRACT, false);
2933 14 Nov 14 olle 149
2933 14 Nov 14 olle 150   /**
2933 14 Nov 14 olle 151     The definition of the "cDNA" extract subtype.
2933 14 Nov 14 olle 152     @since 2.12
2933 14 Nov 14 olle 153   */
3449 28 Jul 15 olle 154   //public static final Subtype CDNA = new Subtype("cDNA", "c", Item.EXTRACT, false);
2933 14 Nov 14 olle 155
2933 14 Nov 14 olle 156   /**
2933 14 Nov 14 olle 157     The definition of the "Library" extract subtype. Should already exist
2933 14 Nov 14 olle 158     in BASE.
2933 14 Nov 14 olle 159     @since 2.12
2933 14 Nov 14 olle 160   */
3449 28 Jul 15 olle 161   public static final Subtype LIBRARY = new Subtype("Library", "lib", Item.EXTRACT, false);
2933 14 Nov 14 olle 162
2933 14 Nov 14 olle 163   /**
2933 14 Nov 14 olle 164     The definition of the "PooledLibrary" extract subtype.
2933 14 Nov 14 olle 165     @since 2.12
2933 14 Nov 14 olle 166   */
3449 28 Jul 15 olle 167   public static final Subtype POOLED_LIBRARY = new Subtype("PooledLibrary", null, Item.EXTRACT, false);
2933 14 Nov 14 olle 168
2933 14 Nov 14 olle 169   /**
2933 14 Nov 14 olle 170     The definition of the "PooledLibraryAliquot" extract subtype.
2933 14 Nov 14 olle 171     @since 2.12
2933 14 Nov 14 olle 172   */
3449 28 Jul 15 olle 173   //public static final Subtype POOLED_LIBRARY_ALIQUOT = new Subtype("PooledLibraryAliquot", "a", Item.EXTRACT, false);
2933 14 Nov 14 olle 174
2933 14 Nov 14 olle 175   /**
2933 14 Nov 14 olle 176     The definition of the "mRNA preparation" protocol subtype.
2933 14 Nov 14 olle 177     @since 2.12
2933 14 Nov 14 olle 178   */
3449 28 Jul 15 olle 179   //public static final Subtype MRNA_PROTOCOL = new Subtype("mRNA preparation", null, Item.PROTOCOL, false);
2933 14 Nov 14 olle 180
2933 14 Nov 14 olle 181   
2933 14 Nov 14 olle 182   /**
2933 14 Nov 14 olle 183     The definition of the "cDNA preparation" protocol subtype.
2933 14 Nov 14 olle 184     @since 2.12
2933 14 Nov 14 olle 185   */
3449 28 Jul 15 olle 186   //public static final Subtype CDNA_PROTOCOL = new Subtype("cDNA preparation", null, Item.PROTOCOL, false);
2933 14 Nov 14 olle 187   
2933 14 Nov 14 olle 188   /**
2933 14 Nov 14 olle 189     The definition of the "Barcode" subtype for tags. Should already
2933 14 Nov 14 olle 190     exist in BASE.
2933 14 Nov 14 olle 191     @since 2.12
2933 14 Nov 14 olle 192    */
3449 28 Jul 15 olle 193   public static final Subtype BARCODE = new Subtype("Barcode", null, Item.TAG, false);
2933 14 Nov 14 olle 194
2933 14 Nov 14 olle 195   /**
2933 14 Nov 14 olle 196     The definition of the "Library preparation" protocol subtype. Should already exist
2933 14 Nov 14 olle 197     in BASE.
3449 28 Jul 15 olle 198     @since 1.3
2933 14 Nov 14 olle 199   */
3449 28 Jul 15 olle 200   public static final Subtype LIBRARY_PROTOCOL = new Subtype("Library preparation", null, Item.PROTOCOL, false);
2933 14 Nov 14 olle 201
3610 20 Nov 15 olle 202   /**
3610 20 Nov 15 olle 203     The definition of the "Library preparation" kit subtype. Should already exist
3610 20 Nov 15 olle 204     in BASE.
3610 20 Nov 15 olle 205     @since 1.3.4
3610 20 Nov 15 olle 206   */
3610 20 Nov 15 olle 207   public static final Subtype LIBRARY_PREPARATION_KIT = new Subtype("Library preparation", null, Item.KIT, false);
2933 14 Nov 14 olle 208   
2933 14 Nov 14 olle 209   /**
2933 14 Nov 14 olle 210     The definition of the "Pooling" protocol subtype. Should already exist
2933 14 Nov 14 olle 211     in BASE.
2933 14 Nov 14 olle 212     @since 2.12
2933 14 Nov 14 olle 213   */
3449 28 Jul 15 olle 214   //public static final Subtype POOLING_PROTOCOL = new Subtype("Pooling", null, Item.PROTOCOL, false);
2933 14 Nov 14 olle 215
2933 14 Nov 14 olle 216   /**
2933 14 Nov 14 olle 217     File subtype for BioAnalyzer PDF reports.
2933 14 Nov 14 olle 218     @since 2.12
2933 14 Nov 14 olle 219   */
3449 28 Jul 15 olle 220   //public static final Subtype BIOANALYZER_PDF = new Subtype("BioAnalyzer PDF", null, Item.FILE, false);
2933 14 Nov 14 olle 221
2933 14 Nov 14 olle 222   /**
2933 14 Nov 14 olle 223     File subtype for Caliper PDF reports.
2933 14 Nov 14 olle 224     @since 2.12
2933 14 Nov 14 olle 225   */
3449 28 Jul 15 olle 226   //public static final Subtype CALIPER_PDF = new Subtype("Caliper PDF", null, Item.FILE, false);
2933 14 Nov 14 olle 227
2933 14 Nov 14 olle 228   /**
2933 14 Nov 14 olle 229     File subtype for Caliper Well Table data files (CSV format).
2933 14 Nov 14 olle 230     @since 2.12
2933 14 Nov 14 olle 231   */
3449 28 Jul 15 olle 232   //public static final Subtype CALIPER_WELL_TABLE = new Subtype("Caliper Well Table", null, Item.FILE, false);
2933 14 Nov 14 olle 233
2933 14 Nov 14 olle 234   /**
2933 14 Nov 14 olle 235     File subtype for Caliper raw data files (GXD format).
2933 14 Nov 14 olle 236     @since 2.12
2933 14 Nov 14 olle 237   */
3449 28 Jul 15 olle 238   //public static final Subtype CALIPER_RAW_DATA = new Subtype("Caliper Raw Data", null, Item.FILE, false);
2933 14 Nov 14 olle 239
2933 14 Nov 14 olle 240   /**
2933 14 Nov 14 olle 241     File subtype for Qubit data files (CSV format).
2933 14 Nov 14 olle 242     @since 2.12
2933 14 Nov 14 olle 243   */
3449 28 Jul 15 olle 244   //public static final Subtype QUBIT_CSV = new Subtype("Qubit CSV", null, Item.FILE, false);
2933 14 Nov 14 olle 245
2933 14 Nov 14 olle 246   /**
5149 28 Nov 18 olle 247     File subtype for BASE-line data files (CSV format).
5149 28 Nov 18 olle 248     @since 1.6.0
5149 28 Nov 18 olle 249   */
5149 28 Nov 18 olle 250   public static final Subtype BASE_LINE_CSV = new Subtype("BASE-line CSV", null, Item.FILE, false);
5149 28 Nov 18 olle 251
5149 28 Nov 18 olle 252   /**
2933 14 Nov 14 olle 253     Create a subtype representation of an ItemSubtype object.
2933 14 Nov 14 olle 254     @since 2.4
2933 14 Nov 14 olle 255   */
2933 14 Nov 14 olle 256   public static final Subtype get(ItemSubtype subtype)
2933 14 Nov 14 olle 257   {
3449 28 Jul 15 olle 258     Subtype s = new Subtype(subtype.getName(), null, subtype.getMainItemType(), subtype.getPushAnnotations());
2933 14 Nov 14 olle 259     s.id = subtype.getId();
2933 14 Nov 14 olle 260     return s;
2933 14 Nov 14 olle 261   }
2933 14 Nov 14 olle 262   
2933 14 Nov 14 olle 263   /**
2933 14 Nov 14 olle 264     Get the subtype by name of the static constant defined in this class.
2933 14 Nov 14 olle 265     
2933 14 Nov 14 olle 266     @param name The name of the static constant
2933 14 Nov 14 olle 267     @return A subtype object or null if not found
2933 14 Nov 14 olle 268     @since 2.4
2933 14 Nov 14 olle 269   */
2933 14 Nov 14 olle 270   public static Subtype getByCName(String cName)
2933 14 Nov 14 olle 271   {
2933 14 Nov 14 olle 272     if (cName == null) return null;
2933 14 Nov 14 olle 273     Subtype subtype = null;
2933 14 Nov 14 olle 274     try
2933 14 Nov 14 olle 275     {
2933 14 Nov 14 olle 276       Field f = Subtype.class.getDeclaredField(cName);
2933 14 Nov 14 olle 277       subtype = (Subtype)f.get(null);
2933 14 Nov 14 olle 278     }
2933 14 Nov 14 olle 279     catch (NoSuchFieldException ex)
2933 14 Nov 14 olle 280     {}
2933 14 Nov 14 olle 281     catch (IllegalAccessException ex)
2933 14 Nov 14 olle 282     {}
2933 14 Nov 14 olle 283     catch (ClassCastException ex)
2933 14 Nov 14 olle 284     {}
2933 14 Nov 14 olle 285     return subtype;
2933 14 Nov 14 olle 286   }
2933 14 Nov 14 olle 287   
2933 14 Nov 14 olle 288   private final String name;
3449 28 Jul 15 olle 289   private final String itemSuffix;
2933 14 Nov 14 olle 290   private final Item mainType;
2933 14 Nov 14 olle 291   private final boolean pushAnnotations;
2933 14 Nov 14 olle 292   private int id;
2933 14 Nov 14 olle 293   private JSONObject json;
2933 14 Nov 14 olle 294   
2933 14 Nov 14 olle 295   /**
2933 14 Nov 14 olle 296     Create a new definition
2933 14 Nov 14 olle 297     @param name The name of the subtype
2933 14 Nov 14 olle 298     @param mainType The main item type of the subtype
2933 14 Nov 14 olle 299   */
3449 28 Jul 15 olle 300   private Subtype(String name, String itemSuffix, Item mainType, boolean pushAnnotations)
2933 14 Nov 14 olle 301   {
2933 14 Nov 14 olle 302     this.name = name;
3449 28 Jul 15 olle 303     this.itemSuffix = itemSuffix;
2933 14 Nov 14 olle 304     this.mainType = mainType;
2933 14 Nov 14 olle 305     this.pushAnnotations = pushAnnotations;
2933 14 Nov 14 olle 306   }
2933 14 Nov 14 olle 307   
2933 14 Nov 14 olle 308   /**
2933 14 Nov 14 olle 309     Get the name of the subtype.
2933 14 Nov 14 olle 310   */
2933 14 Nov 14 olle 311   public String getName()
2933 14 Nov 14 olle 312   {
2933 14 Nov 14 olle 313     return name;
2933 14 Nov 14 olle 314   }
2933 14 Nov 14 olle 315   
2933 14 Nov 14 olle 316   /**
3449 28 Jul 15 olle 317     Get the suffix to use for items of this type.
3449 28 Jul 15 olle 318     Null if no suffix is used.
3449 28 Jul 15 olle 319     @since 1.3
3449 28 Jul 15 olle 320   */
3449 28 Jul 15 olle 321   public String getItemSuffix()
3449 28 Jul 15 olle 322   {
3449 28 Jul 15 olle 323     return itemSuffix;
3449 28 Jul 15 olle 324   }
3449 28 Jul 15 olle 325
3449 28 Jul 15 olle 326   /**
2933 14 Nov 14 olle 327     Get the main item type of the subtype.
2933 14 Nov 14 olle 328   */
2933 14 Nov 14 olle 329   public Item getMainType()
2933 14 Nov 14 olle 330   {
2933 14 Nov 14 olle 331     return mainType;
2933 14 Nov 14 olle 332   }
2933 14 Nov 14 olle 333   
2933 14 Nov 14 olle 334   /**
2933 14 Nov 14 olle 335     Should annotations on items with this subtype be pushed
2933 14 Nov 14 olle 336     to the parent item or not?
2933 14 Nov 14 olle 337     @since 2.5
2933 14 Nov 14 olle 338   */
2933 14 Nov 14 olle 339   public boolean getPushAnnotations()
2933 14 Nov 14 olle 340   {
2933 14 Nov 14 olle 341     return pushAnnotations;
2933 14 Nov 14 olle 342   }
2933 14 Nov 14 olle 343   
2933 14 Nov 14 olle 344   /**
2933 14 Nov 14 olle 345     Get the subtype information as a JSON object ready to be sent as an AJAX response.
2933 14 Nov 14 olle 346     @since 2.4
2933 14 Nov 14 olle 347   */
2933 14 Nov 14 olle 348   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 349   public JSONObject asJSONObject(DbControl dc)
2933 14 Nov 14 olle 350   {
2933 14 Nov 14 olle 351     if (json == null)
2933 14 Nov 14 olle 352     {
2933 14 Nov 14 olle 353       if (id==0) load(dc); // Ensure that the subtype has been loaded
2933 14 Nov 14 olle 354       json = new JSONObject();
2933 14 Nov 14 olle 355       json.put("id", id);
2933 14 Nov 14 olle 356       json.put("name", getName());
2933 14 Nov 14 olle 357       json.put("mainType", getMainType().name());
2933 14 Nov 14 olle 358     }
2933 14 Nov 14 olle 359     return json;
2933 14 Nov 14 olle 360   }
2933 14 Nov 14 olle 361   
2933 14 Nov 14 olle 362   /**
2933 14 Nov 14 olle 363     Load the subtype as a BASE item. Same as {@link #get(DbControl)}
2933 14 Nov 14 olle 364     but throw an exception instead of returning null if no BASE
2933 14 Nov 14 olle 365     item exists.
2933 14 Nov 14 olle 366     @param dc The DbControl to use for database access
2933 14 Nov 14 olle 367     @return An ItemSubtype object
2933 14 Nov 14 olle 368   */
2933 14 Nov 14 olle 369   public ItemSubtype load(DbControl dc)
2933 14 Nov 14 olle 370   {
2933 14 Nov 14 olle 371     ItemSubtype subtype = null;
2933 14 Nov 14 olle 372     if (id == 0)
2933 14 Nov 14 olle 373     {
2933 14 Nov 14 olle 374       List<ItemSubtype> result = list(dc);
2933 14 Nov 14 olle 375       if (result.size() == 0)
2933 14 Nov 14 olle 376       {
2933 14 Nov 14 olle 377         throw new ItemNotFoundException("ItemSubtype["+name+"]");
2933 14 Nov 14 olle 378       }
2933 14 Nov 14 olle 379       else if (result.size() > 1)
2933 14 Nov 14 olle 380       {
2933 14 Nov 14 olle 381         throw new InvalidDataException("Found > 1 ItemSubtype["+name+"]");
2933 14 Nov 14 olle 382       }
2933 14 Nov 14 olle 383       subtype = result.get(0);
2933 14 Nov 14 olle 384       id = subtype.getId();
2933 14 Nov 14 olle 385     }
2933 14 Nov 14 olle 386     else
2933 14 Nov 14 olle 387     {
2933 14 Nov 14 olle 388       subtype = ItemSubtype.getById(dc, id);
2933 14 Nov 14 olle 389     }
2933 14 Nov 14 olle 390     return subtype;
2933 14 Nov 14 olle 391   }
2933 14 Nov 14 olle 392   
2933 14 Nov 14 olle 393   /**
2933 14 Nov 14 olle 394     Load the subtype as a BASE item. Same as {@link #load(DbControl)} but return null
2933 14 Nov 14 olle 395     if no BASE item is found instead of throwing an exception.
2933 14 Nov 14 olle 396     @param dc The DbControl to use for database access
2933 14 Nov 14 olle 397     @return An ItemSubtype object
2933 14 Nov 14 olle 398     @since 2.6
2933 14 Nov 14 olle 399   */
2933 14 Nov 14 olle 400   public ItemSubtype get(DbControl dc)
2933 14 Nov 14 olle 401   {
2933 14 Nov 14 olle 402     ItemSubtype subtype = null;
2933 14 Nov 14 olle 403     if (id == 0)
2933 14 Nov 14 olle 404     {
2933 14 Nov 14 olle 405       List<ItemSubtype> result = list(dc);
2933 14 Nov 14 olle 406       if (result.size() == 1)
2933 14 Nov 14 olle 407       {
2933 14 Nov 14 olle 408         subtype = result.get(0);
2933 14 Nov 14 olle 409         id = subtype.getId();
2933 14 Nov 14 olle 410       }
2933 14 Nov 14 olle 411     }
2933 14 Nov 14 olle 412     else
2933 14 Nov 14 olle 413     {
2933 14 Nov 14 olle 414       subtype = ItemSubtype.getById(dc, id);
2933 14 Nov 14 olle 415     }
2933 14 Nov 14 olle 416     return subtype;
2933 14 Nov 14 olle 417     
2933 14 Nov 14 olle 418   }
2933 14 Nov 14 olle 419   
2933 14 Nov 14 olle 420   /**
2933 14 Nov 14 olle 421     List all subtypes registered in BASE with a name and main item type
2933 14 Nov 14 olle 422     matching this subtype definition. Normally, only a single subtype 
2933 14 Nov 14 olle 423     should be returned.
2933 14 Nov 14 olle 424   */
2933 14 Nov 14 olle 425   public List<ItemSubtype> list(DbControl dc)
2933 14 Nov 14 olle 426   {
2933 14 Nov 14 olle 427     ItemQuery<ItemSubtype> query = ItemSubtype.getQuery(getMainType());
2933 14 Nov 14 olle 428     query.restrict(
2933 14 Nov 14 olle 429       Restrictions.eq(
2933 14 Nov 14 olle 430         Hql.property("name"), 
2933 14 Nov 14 olle 431         Expressions.parameter("name", getName(), Type.STRING)
2933 14 Nov 14 olle 432       ));
2933 14 Nov 14 olle 433     query.include(Include.ALL);
2933 14 Nov 14 olle 434     return query.list(dc);
2933 14 Nov 14 olle 435   }
2933 14 Nov 14 olle 436   
2933 14 Nov 14 olle 437   /**
2933 14 Nov 14 olle 438     Add a filter restriction the given query so that it
2933 14 Nov 14 olle 439     only return items of this subtype.
2933 14 Nov 14 olle 440     
2933 14 Nov 14 olle 441     @param query The query to filter
2933 14 Nov 14 olle 442     @since 2.1
2933 14 Nov 14 olle 443   */
2933 14 Nov 14 olle 444   public void addFilter(DbControl dc, ItemQuery<? extends Subtypable> query)
2933 14 Nov 14 olle 445   {
2933 14 Nov 14 olle 446     addFilter(dc, query, null);
2933 14 Nov 14 olle 447   }
2933 14 Nov 14 olle 448
2933 14 Nov 14 olle 449   /**
2933 14 Nov 14 olle 450     Add a filter restriction to the given query based on the 
2933 14 Nov 14 olle 451     given subtype. If no alias is specified, the filter is
2933 14 Nov 14 olle 452     applied to the root item, otherwise it is applied
2933 14 Nov 14 olle 453     to the alias of a joined (eg. parent or child) item
2933 14 Nov 14 olle 454     
2933 14 Nov 14 olle 455     @param query The query to restrict
2933 14 Nov 14 olle 456     @param alias Specify an alias if the filter should be
2933 14 Nov 14 olle 457       placed on a joined (eg. child or parent) item instead
2933 14 Nov 14 olle 458       of the root item
2933 14 Nov 14 olle 459     @since 2.1
2933 14 Nov 14 olle 460   */
2933 14 Nov 14 olle 461   public void addFilter(DbControl dc, ItemQuery<?> query, String alias)
2933 14 Nov 14 olle 462   {
2933 14 Nov 14 olle 463     query.restrict(restriction(dc, alias));
2933 14 Nov 14 olle 464   }
2933 14 Nov 14 olle 465   
2933 14 Nov 14 olle 466   public Restriction restriction(DbControl dc, String alias)
2933 14 Nov 14 olle 467   {
2933 14 Nov 14 olle 468     if (id==0) load(dc); // Ensure that the subtype has been loaded
2933 14 Nov 14 olle 469     return Restrictions.eq(Hql.property(alias, "itemSubtype.id"), Expressions.integer(id));
2933 14 Nov 14 olle 470   }
2933 14 Nov 14 olle 471
3449 28 Jul 15 olle 472   /**
3449 28 Jul 15 olle 473     Get the latest item that is the project default item of this
3449 28 Jul 15 olle 474     subtype. In this case, an item with a higher ID is considered 
3449 28 Jul 15 olle 475     later than an item with a lower ID.
3449 28 Jul 15 olle 476     @since   1.3
3449 28 Jul 15 olle 477   */
3449 28 Jul 15 olle 478   public BasicItem getLatestProjectDefault(DbControl dc)
3449 28 Jul 15 olle 479   {
3449 28 Jul 15 olle 480     int projectId = dc.getSessionControl().getActiveProjectId();
3449 28 Jul 15 olle 481     BasicItem bestMatch = null;
3449 28 Jul 15 olle 482     if (projectId != 0)
3449 28 Jul 15 olle 483     {
3449 28 Jul 15 olle 484       Project p = Project.getById(dc, projectId);
3449 28 Jul 15 olle 485       List<? extends BasicItem> defaultItems = p.findDefaultItems(dc, get(dc), true);
3449 28 Jul 15 olle 486       for (BasicItem item : defaultItems)
3449 28 Jul 15 olle 487       {
3449 28 Jul 15 olle 488         if (bestMatch == null || bestMatch.getId() < item.getId())
3449 28 Jul 15 olle 489         {
3449 28 Jul 15 olle 490           bestMatch = item;
3449 28 Jul 15 olle 491         }
3449 28 Jul 15 olle 492       }
3449 28 Jul 15 olle 493     }
3449 28 Jul 15 olle 494     return bestMatch;
3449 28 Jul 15 olle 495   }
3449 28 Jul 15 olle 496
2933 14 Nov 14 olle 497 }