extensions/net.sf.basedb.relax/trunk/src/net/sf/basedb/relax/dao/Annotationtype.java

Code
Comments
Other
Rev Date Author Line
5176 05 Dec 18 nicklas 1 package net.sf.basedb.relax.dao;
5176 05 Dec 18 nicklas 2
5176 05 Dec 18 nicklas 3 import java.lang.reflect.Field;
5176 05 Dec 18 nicklas 4 import java.util.List;
5176 05 Dec 18 nicklas 5
5176 05 Dec 18 nicklas 6 import org.json.simple.JSONObject;
5176 05 Dec 18 nicklas 7
5176 05 Dec 18 nicklas 8 import net.sf.basedb.core.AnnotationType;
5176 05 Dec 18 nicklas 9 import net.sf.basedb.core.DbControl;
5176 05 Dec 18 nicklas 10 import net.sf.basedb.core.Include;
5176 05 Dec 18 nicklas 11 import net.sf.basedb.core.InvalidDataException;
5176 05 Dec 18 nicklas 12 import net.sf.basedb.core.Item;
5176 05 Dec 18 nicklas 13 import net.sf.basedb.core.ItemNotFoundException;
5176 05 Dec 18 nicklas 14 import net.sf.basedb.core.ItemQuery;
5176 05 Dec 18 nicklas 15 import net.sf.basedb.core.Type;
5176 05 Dec 18 nicklas 16 import net.sf.basedb.core.query.Expression;
5176 05 Dec 18 nicklas 17 import net.sf.basedb.core.query.Expressions;
5176 05 Dec 18 nicklas 18 import net.sf.basedb.core.query.Hql;
5176 05 Dec 18 nicklas 19 import net.sf.basedb.core.query.Restrictions;
5176 05 Dec 18 nicklas 20
5176 05 Dec 18 nicklas 21 public class Annotationtype 
5176 05 Dec 18 nicklas 22 {
5176 05 Dec 18 nicklas 23   /**
5176 05 Dec 18 nicklas 24     An array with ALL item types that are annotatable and used in releases.
5176 05 Dec 18 nicklas 25     @since 1.4
5176 05 Dec 18 nicklas 26   */
5176 05 Dec 18 nicklas 27   public static final Item[] ALL_ITEM_TYPES = { Item.BIOSOURCE, Item.SAMPLE, Item.EXTRACT, Item.DERIVEDBIOASSAY, Item.RAWBIOASSAY };
5176 05 Dec 18 nicklas 28   
5176 05 Dec 18 nicklas 29   /**
5176 05 Dec 18 nicklas 30     The "FirstReleasedIn" annotation type, used
5176 05 Dec 18 nicklas 31     for storing the release version number that an
5176 05 Dec 18 nicklas 32     item first appeared in.
5176 05 Dec 18 nicklas 33     @since 1.4
5176 05 Dec 18 nicklas 34   */
5176 05 Dec 18 nicklas 35   public static final Annotationtype FIRST_RELEASED_IN = 
5176 05 Dec 18 nicklas 36     new Annotationtype("FirstReleasedIn", Type.STRING, ALL_ITEM_TYPES);
5176 05 Dec 18 nicklas 37
5176 05 Dec 18 nicklas 38   
5176 05 Dec 18 nicklas 39   /**
5176 05 Dec 18 nicklas 40     Get the annotation type by name of the static constant defined in this class.
5176 05 Dec 18 nicklas 41     
5176 05 Dec 18 nicklas 42     @param cName The name of the static constant
5176 05 Dec 18 nicklas 43     @return An annotationtype object or null if not found
5176 05 Dec 18 nicklas 44   */
5176 05 Dec 18 nicklas 45   public static Annotationtype getByCName(String cName)
5176 05 Dec 18 nicklas 46   {
5176 05 Dec 18 nicklas 47     if (cName == null) return null;
5176 05 Dec 18 nicklas 48     Annotationtype type = null;
5176 05 Dec 18 nicklas 49     try
5176 05 Dec 18 nicklas 50     {
5176 05 Dec 18 nicklas 51       Field f = Annotationtype.class.getDeclaredField(cName);
5176 05 Dec 18 nicklas 52       type = (Annotationtype)f.get(null);
5176 05 Dec 18 nicklas 53     }
5176 05 Dec 18 nicklas 54     catch (NoSuchFieldException ex)
5176 05 Dec 18 nicklas 55     {}
5176 05 Dec 18 nicklas 56     catch (IllegalAccessException ex)
5176 05 Dec 18 nicklas 57     {}
5176 05 Dec 18 nicklas 58     catch (ClassCastException ex)
5176 05 Dec 18 nicklas 59     {}
5176 05 Dec 18 nicklas 60     return type;
5176 05 Dec 18 nicklas 61   }
5176 05 Dec 18 nicklas 62
5176 05 Dec 18 nicklas 63   
5176 05 Dec 18 nicklas 64   private final String name;
5176 05 Dec 18 nicklas 65   private final Item[] mainType;
5176 05 Dec 18 nicklas 66   private final Type valueType;
5176 05 Dec 18 nicklas 67
5176 05 Dec 18 nicklas 68   private int id;
5176 05 Dec 18 nicklas 69   private JSONObject json;
5176 05 Dec 18 nicklas 70   
5176 05 Dec 18 nicklas 71   /**
5176 05 Dec 18 nicklas 72     Create a new definition of an annotation type.
5176 05 Dec 18 nicklas 73     
5176 05 Dec 18 nicklas 74     @param name The name of the subtype
5176 05 Dec 18 nicklas 75     @param valueType The date type of values that can be stored 
5176 05 Dec 18 nicklas 76     @param mainType The main item type(s) of the annotation type
5176 05 Dec 18 nicklas 77   */
5176 05 Dec 18 nicklas 78   private Annotationtype(String name, Type valueType, Item... mainType)
5176 05 Dec 18 nicklas 79   {
5176 05 Dec 18 nicklas 80     this.name = name;
5176 05 Dec 18 nicklas 81     this.valueType = valueType;
5176 05 Dec 18 nicklas 82     this.mainType = mainType;
5176 05 Dec 18 nicklas 83   }
5176 05 Dec 18 nicklas 84
5176 05 Dec 18 nicklas 85   /**
5176 05 Dec 18 nicklas 86     Get the name of the annotation type.
5176 05 Dec 18 nicklas 87   */
5176 05 Dec 18 nicklas 88   public String getName()
5176 05 Dec 18 nicklas 89   {
5176 05 Dec 18 nicklas 90     return name;
5176 05 Dec 18 nicklas 91   }
5176 05 Dec 18 nicklas 92   
5176 05 Dec 18 nicklas 93   /**
5176 05 Dec 18 nicklas 94     Get the data type of the values that can be stored.
5176 05 Dec 18 nicklas 95   */
5176 05 Dec 18 nicklas 96   public Type getValueType()
5176 05 Dec 18 nicklas 97   {
5176 05 Dec 18 nicklas 98     return valueType;
5176 05 Dec 18 nicklas 99   }
5176 05 Dec 18 nicklas 100   
5176 05 Dec 18 nicklas 101   /**
5176 05 Dec 18 nicklas 102     Get the item type on which this annotation type can be used.
5176 05 Dec 18 nicklas 103   */
5176 05 Dec 18 nicklas 104   public Item[] getMainType()
5176 05 Dec 18 nicklas 105   {
5176 05 Dec 18 nicklas 106     return mainType;
5176 05 Dec 18 nicklas 107   }
5176 05 Dec 18 nicklas 108   
5176 05 Dec 18 nicklas 109   /**
5176 05 Dec 18 nicklas 110     Get the annotation type information as a JSON object ready to be sent as an AJAX response.
5176 05 Dec 18 nicklas 111   */
5176 05 Dec 18 nicklas 112   public JSONObject asJSONObject(DbControl dc)
5176 05 Dec 18 nicklas 113   {
5176 05 Dec 18 nicklas 114     if (json == null)
5176 05 Dec 18 nicklas 115     {
5176 05 Dec 18 nicklas 116       if (id==0) load(dc); // Ensure that the annotationtype has been loaded
5176 05 Dec 18 nicklas 117       json = new JSONObject();
5176 05 Dec 18 nicklas 118       json.put("id", id);
5176 05 Dec 18 nicklas 119       json.put("name", getName());
5176 05 Dec 18 nicklas 120     }
5176 05 Dec 18 nicklas 121     return json;
5176 05 Dec 18 nicklas 122   }
5176 05 Dec 18 nicklas 123
5176 05 Dec 18 nicklas 124   /**
5176 05 Dec 18 nicklas 125     Load the underlying annotation type. If it doesn't exists and exception is thrown.
5176 05 Dec 18 nicklas 126     
5176 05 Dec 18 nicklas 127     @param dc The DbControl to use for database access
5176 05 Dec 18 nicklas 128     @return An AnnotationType object
5176 05 Dec 18 nicklas 129   */
5176 05 Dec 18 nicklas 130   public AnnotationType load(DbControl dc)
5176 05 Dec 18 nicklas 131   {
5176 05 Dec 18 nicklas 132     AnnotationType type = null;
5176 05 Dec 18 nicklas 133     if (id == 0)
5176 05 Dec 18 nicklas 134     {
5176 05 Dec 18 nicklas 135       List<AnnotationType> result = list(dc);
5176 05 Dec 18 nicklas 136       if (result.size() == 0)
5176 05 Dec 18 nicklas 137       {
5176 05 Dec 18 nicklas 138         throw new ItemNotFoundException("AnnotationType["+name+"]");
5176 05 Dec 18 nicklas 139       }
5176 05 Dec 18 nicklas 140       else if (result.size() > 1)
5176 05 Dec 18 nicklas 141       {
5176 05 Dec 18 nicklas 142         throw new InvalidDataException("Found > 1 AnnotationType["+name+"]");
5176 05 Dec 18 nicklas 143       }
5176 05 Dec 18 nicklas 144       type = result.get(0);
5176 05 Dec 18 nicklas 145       id = type.getId();
5176 05 Dec 18 nicklas 146     }
5176 05 Dec 18 nicklas 147     else
5176 05 Dec 18 nicklas 148     {
5176 05 Dec 18 nicklas 149       type = AnnotationType.getById(dc, id);
5176 05 Dec 18 nicklas 150     }
5176 05 Dec 18 nicklas 151     return type;
5176 05 Dec 18 nicklas 152   }
5176 05 Dec 18 nicklas 153   
5176 05 Dec 18 nicklas 154   /**
5176 05 Dec 18 nicklas 155     Load the annotation type as a BASE item. Same as {@link #load(DbControl)} but return null
5176 05 Dec 18 nicklas 156     if no BASE item is found instead of throwing an exception.
5176 05 Dec 18 nicklas 157     @param dc The DbControl to use for database access
5176 05 Dec 18 nicklas 158     @return An ItemSubtype object
5176 05 Dec 18 nicklas 159     @since 2.16
5176 05 Dec 18 nicklas 160   */
5176 05 Dec 18 nicklas 161   public AnnotationType get(DbControl dc)
5176 05 Dec 18 nicklas 162   {
5176 05 Dec 18 nicklas 163     AnnotationType type = null;
5176 05 Dec 18 nicklas 164     if (id == 0)
5176 05 Dec 18 nicklas 165     {
5176 05 Dec 18 nicklas 166       List<AnnotationType> result = list(dc);
5176 05 Dec 18 nicklas 167       if (result.size() == 1)
5176 05 Dec 18 nicklas 168       {
5176 05 Dec 18 nicklas 169         type = result.get(0);
5176 05 Dec 18 nicklas 170         id = type.getId();
5176 05 Dec 18 nicklas 171       }
5176 05 Dec 18 nicklas 172     }
5176 05 Dec 18 nicklas 173     else
5176 05 Dec 18 nicklas 174     {
5176 05 Dec 18 nicklas 175       type = AnnotationType.getById(dc, id);
5176 05 Dec 18 nicklas 176     }
5176 05 Dec 18 nicklas 177     return type;
5176 05 Dec 18 nicklas 178   }
5176 05 Dec 18 nicklas 179   
5176 05 Dec 18 nicklas 180   /**
5176 05 Dec 18 nicklas 181     List all annotation types registered in BASE with a name and main item type 
5176 05 Dec 18 nicklas 182     matching this annotation type definition. Normally, only a single annotation
5176 05 Dec 18 nicklas 183     type should be returned.
5176 05 Dec 18 nicklas 184   */
5176 05 Dec 18 nicklas 185   public List<AnnotationType> list(DbControl dc)
5176 05 Dec 18 nicklas 186   {
5176 05 Dec 18 nicklas 187     ItemQuery<AnnotationType> query = AnnotationType.getQuery(null);
5176 05 Dec 18 nicklas 188     query.restrict(Restrictions.eq(Hql.property("name"), Expressions.parameter("name", name, Type.STRING)));
5176 05 Dec 18 nicklas 189     
5176 05 Dec 18 nicklas 190     Item[] mt = getMainType();
5176 05 Dec 18 nicklas 191     Expression[] mainTypes = new Expression[mt.length];
5176 05 Dec 18 nicklas 192     for (int i = 0; i < mainTypes.length; ++i)
5176 05 Dec 18 nicklas 193     {
5176 05 Dec 18 nicklas 194       mainTypes[i] = Expressions.integer(mt[i].getValue());
5176 05 Dec 18 nicklas 195     }
5176 05 Dec 18 nicklas 196     if (mainTypes.length > 0)
5176 05 Dec 18 nicklas 197     {
5176 05 Dec 18 nicklas 198       query.joinPermanent(Hql.innerJoin("itemTypes", "it"));
5176 05 Dec 18 nicklas 199       query.restrictPermanent(Restrictions.in(Hql.alias("it"), mainTypes));
5176 05 Dec 18 nicklas 200     }
5176 05 Dec 18 nicklas 201   
5176 05 Dec 18 nicklas 202     query.include(Include.ALL);
5176 05 Dec 18 nicklas 203     query.setDistinct(true);
5176 05 Dec 18 nicklas 204     return query.list(dc);
5176 05 Dec 18 nicklas 205   }
5176 05 Dec 18 nicklas 206
5176 05 Dec 18 nicklas 207 }