extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/dao/MeludiItem.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 org.json.simple.JSONObject;
2933 14 Nov 14 olle 4
2933 14 Nov 14 olle 5 import net.sf.basedb.core.Annotatable;
2933 14 Nov 14 olle 6 import net.sf.basedb.core.AnnotationType;
2933 14 Nov 14 olle 7 import net.sf.basedb.core.DbControl;
2933 14 Nov 14 olle 8 import net.sf.basedb.core.ItemNotFoundException;
2933 14 Nov 14 olle 9 import net.sf.basedb.core.Nameable;
2933 14 Nov 14 olle 10 import net.sf.basedb.core.PermissionDeniedException;
3440 17 Jul 15 olle 11 import net.sf.basedb.core.snapshot.SnapshotManager;
2933 14 Nov 14 olle 12 import net.sf.basedb.meludi.JsonUtil;
2933 14 Nov 14 olle 13 import net.sf.basedb.meludi.converter.IdentityConverter;
2933 14 Nov 14 olle 14 import net.sf.basedb.meludi.converter.ValueConverter;
3233 09 Apr 15 olle 15 import java.util.ArrayList;
3233 09 Apr 15 olle 16 import java.util.List;
2933 14 Nov 14 olle 17
2933 14 Nov 14 olle 18
2933 14 Nov 14 olle 19 /**
3440 17 Jul 15 olle 20   An abstract base class for MeLuDI-specific items that have
2933 14 Nov 14 olle 21   been mapped to BASE items using some special rules. This class
2933 14 Nov 14 olle 22   can be used on items that are {@link Annotatable} and
2933 14 Nov 14 olle 23   {@link Nameable}.
2933 14 Nov 14 olle 24   
2933 14 Nov 14 olle 25   @author nicklas
2933 14 Nov 14 olle 26   @since 1.2
2933 14 Nov 14 olle 27 */
2933 14 Nov 14 olle 28 public abstract class MeludiItem<T extends Annotatable & Nameable>
2933 14 Nov 14 olle 29 {
2933 14 Nov 14 olle 30
2933 14 Nov 14 olle 31   
2933 14 Nov 14 olle 32   private final T item;
2933 14 Nov 14 olle 33   private JSONObject json;
2933 14 Nov 14 olle 34   
2933 14 Nov 14 olle 35   protected MeludiItem(T item)
2933 14 Nov 14 olle 36   {
2933 14 Nov 14 olle 37     this.item = item;
2933 14 Nov 14 olle 38   }
2933 14 Nov 14 olle 39
2933 14 Nov 14 olle 40   /**
3440 17 Jul 15 olle 41     Get the real BASE item that this MeLuDI item represents.
2933 14 Nov 14 olle 42   */
2933 14 Nov 14 olle 43   public T getItem()
2933 14 Nov 14 olle 44   {
2933 14 Nov 14 olle 45     return item;
2933 14 Nov 14 olle 46   }
2933 14 Nov 14 olle 47   
2933 14 Nov 14 olle 48   /**
2933 14 Nov 14 olle 49     Get the name of the item. 
2933 14 Nov 14 olle 50   */
2933 14 Nov 14 olle 51   public String getName()
2933 14 Nov 14 olle 52   {
2933 14 Nov 14 olle 53     return item.getName();
2933 14 Nov 14 olle 54   }
2933 14 Nov 14 olle 55   
2933 14 Nov 14 olle 56   @Override
2933 14 Nov 14 olle 57   public boolean equals(Object o) 
2933 14 Nov 14 olle 58   {
2933 14 Nov 14 olle 59     if (this == o) return true;
2933 14 Nov 14 olle 60     if (o == null || this.getClass() != o.getClass()) return false;
2933 14 Nov 14 olle 61     return item.equals(((MeludiItem)o).item);
2933 14 Nov 14 olle 62   }
2933 14 Nov 14 olle 63
2933 14 Nov 14 olle 64   @Override
2933 14 Nov 14 olle 65   public int hashCode() 
2933 14 Nov 14 olle 66   {
2933 14 Nov 14 olle 67     return item.hashCode();
2933 14 Nov 14 olle 68   }
2933 14 Nov 14 olle 69
2933 14 Nov 14 olle 70   /**
2933 14 Nov 14 olle 71     Initialize a JSON object with information. Subclasses
2933 14 Nov 14 olle 72     should override this method if the need to put in more
2933 14 Nov 14 olle 73     than the 'id', 'name' or loaded annotations (see {@link #loadAnnotations(String, AnnotationType, ValueConverter)})
2933 14 Nov 14 olle 74   */
2933 14 Nov 14 olle 75   protected void initJSON(JSONObject json)
2933 14 Nov 14 olle 76   {}
2933 14 Nov 14 olle 77   
2933 14 Nov 14 olle 78   /**
2933 14 Nov 14 olle 79     Get the information as a JSON object ready to be sent as an AJAX response.
2933 14 Nov 14 olle 80   */
2933 14 Nov 14 olle 81   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 82   public JSONObject asJSONObject()
2933 14 Nov 14 olle 83   {
2933 14 Nov 14 olle 84     if (json == null)
2933 14 Nov 14 olle 85     {
2933 14 Nov 14 olle 86       json = new JSONObject();
2933 14 Nov 14 olle 87       json.put("id", item.getId());
2933 14 Nov 14 olle 88       json.put("name", item.getName());
2933 14 Nov 14 olle 89       initJSON(json);
2933 14 Nov 14 olle 90     }
2933 14 Nov 14 olle 91     return json;
2933 14 Nov 14 olle 92   }
2933 14 Nov 14 olle 93   
2933 14 Nov 14 olle 94   /**
2933 14 Nov 14 olle 95     Load annotations for the given annotation type and store the values in
2933 14 Nov 14 olle 96     the given JSON key. Single-valued annotation types are stored as a simple
2933 14 Nov 14 olle 97     key-value pair. Multi-valued annotation types are stored as a
2933 14 Nov 14 olle 98     key-array pair (even if there is only one value in the array).
2933 14 Nov 14 olle 99   */
2933 14 Nov 14 olle 100   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 101   public void loadAnnotations(DbControl dc, String jsonKey, Annotationtype annotationType, ValueConverter converter)
2933 14 Nov 14 olle 102   {
2933 14 Nov 14 olle 103     if (converter == null) converter = IdentityConverter.INSTANCE;
2933 14 Nov 14 olle 104     try
2933 14 Nov 14 olle 105     {
2933 14 Nov 14 olle 106       AnnotationType at = annotationType.load(dc);
2933 14 Nov 14 olle 107       JSONObject json = asJSONObject();
2933 14 Nov 14 olle 108       if (at.getMultiplicity() == 1)
2933 14 Nov 14 olle 109       {
2933 14 Nov 14 olle 110         json.put(jsonKey, converter.convert(annotationType.getAnnotationValue(dc, item)));
2933 14 Nov 14 olle 111       }
2933 14 Nov 14 olle 112       else
2933 14 Nov 14 olle 113       {
2933 14 Nov 14 olle 114         json.put(jsonKey, JsonUtil.toArray(annotationType.getAnnotationValues(dc, item), converter));
2933 14 Nov 14 olle 115       }
2933 14 Nov 14 olle 116     }
2933 14 Nov 14 olle 117     catch (PermissionDeniedException ex)
2933 14 Nov 14 olle 118     {
2933 14 Nov 14 olle 119       json.put(jsonKey, "No permission");
2933 14 Nov 14 olle 120     }
2933 14 Nov 14 olle 121     catch (ItemNotFoundException ex)
2933 14 Nov 14 olle 122     {
2933 14 Nov 14 olle 123       json.put(jsonKey, "Not found (may indicate lack of permission)");
2933 14 Nov 14 olle 124     }
2933 14 Nov 14 olle 125     catch (RuntimeException ex)
2933 14 Nov 14 olle 126     {
2933 14 Nov 14 olle 127       json.put(jsonKey, ex.getMessage());
2933 14 Nov 14 olle 128     }
2933 14 Nov 14 olle 129   }
2933 14 Nov 14 olle 130   
2933 14 Nov 14 olle 131   /**
3233 09 Apr 15 olle 132     Load annotations for the given annotation type and store the values in
3233 09 Apr 15 olle 133     the given JSON key. Single-valued annotation types are stored as a simple
3233 09 Apr 15 olle 134     key-value pair. Multi-valued annotation types are stored as a
3233 09 Apr 15 olle 135     key-array pair (even if there is only one value in the array).
3440 17 Jul 15 olle 136   */
3440 17 Jul 15 olle 137   @SuppressWarnings("unchecked")
3440 17 Jul 15 olle 138   public void loadAnnotations(DbControl dc, SnapshotManager manager, String jsonKey, Annotationtype annotationType, ValueConverter converter)
3440 17 Jul 15 olle 139   {
3440 17 Jul 15 olle 140     loadAnnotations(dc, manager, jsonKey, annotationType, converter, false);
3440 17 Jul 15 olle 141   }
3440 17 Jul 15 olle 142
3440 17 Jul 15 olle 143   /**
3440 17 Jul 15 olle 144     Load annotations for the given annotation type and store the values in
3440 17 Jul 15 olle 145     the given JSON key. Single-valued annotation types are stored as a simple
3440 17 Jul 15 olle 146     key-value pair. Multi-valued annotation types are stored as a
3440 17 Jul 15 olle 147     key-array pair (even if there is only one value in the array).
3233 09 Apr 15 olle 148     If flag 'fromListString' is set to 'true', the list is expected to be
3233 09 Apr 15 olle 149     stored as a string with comma-separated values.
3233 09 Apr 15 olle 150   */
3233 09 Apr 15 olle 151   @SuppressWarnings("unchecked")
3440 17 Jul 15 olle 152   public void loadAnnotations(DbControl dc, SnapshotManager manager, String jsonKey, Annotationtype annotationType, ValueConverter converter, Boolean fromListString)
3233 09 Apr 15 olle 153   {
3440 17 Jul 15 olle 154     loadAnnotations(dc, manager, jsonKey, annotationType, converter, fromListString, false);
3233 09 Apr 15 olle 155   }
3233 09 Apr 15 olle 156
3233 09 Apr 15 olle 157   /**
3233 09 Apr 15 olle 158     Load annotations for the given annotation type and store the values in
3233 09 Apr 15 olle 159     the given JSON key. Single-valued annotation types are stored as a simple
3233 09 Apr 15 olle 160     key-value pair. Multi-valued annotation types are stored as a
3233 09 Apr 15 olle 161     key-array pair (even if there is only one value in the array).
3233 09 Apr 15 olle 162     If flag 'fromListString' is set to 'true', the list is expected to be
3233 09 Apr 15 olle 163     stored as a string with comma-separated values.
3233 09 Apr 15 olle 164   */
3233 09 Apr 15 olle 165   @SuppressWarnings("unchecked")
3440 17 Jul 15 olle 166   public void loadAnnotations(DbControl dc, SnapshotManager manager, String jsonKey, Annotationtype annotationType, ValueConverter converter, Boolean fromListString, Boolean trim)
3233 09 Apr 15 olle 167   {
3233 09 Apr 15 olle 168     if (converter == null) converter = IdentityConverter.INSTANCE;
3233 09 Apr 15 olle 169     try
3233 09 Apr 15 olle 170     {
3233 09 Apr 15 olle 171       AnnotationType at = annotationType.load(dc);
3233 09 Apr 15 olle 172       JSONObject json = asJSONObject();
3233 09 Apr 15 olle 173       if (at.getMultiplicity() == 1)
3233 09 Apr 15 olle 174       {
3233 09 Apr 15 olle 175         if (fromListString == null || !fromListString)
3233 09 Apr 15 olle 176         {
3440 17 Jul 15 olle 177           json.put(jsonKey, converter.convert(annotationType.getAnnotationValue(dc, manager, item)));
3233 09 Apr 15 olle 178         }
3233 09 Apr 15 olle 179         else
3233 09 Apr 15 olle 180         {
3233 09 Apr 15 olle 181           List<String> list = new ArrayList<String>(); 
3440 17 Jul 15 olle 182           String listStr = (String) annotationType.getAnnotationValue(dc, manager, item);
3233 09 Apr 15 olle 183           if (listStr != null && !listStr.equals(""))
3233 09 Apr 15 olle 184           {
3233 09 Apr 15 olle 185             String[] itemNames = listStr.split(",");
3233 09 Apr 15 olle 186             for (int i = 0; i < itemNames.length; i++)
3233 09 Apr 15 olle 187             {
3233 09 Apr 15 olle 188               String itemName = itemNames[i];
3233 09 Apr 15 olle 189               // Optional removal of leading and trailing white space
3233 09 Apr 15 olle 190               if (itemName != null && trim != null && trim)
3233 09 Apr 15 olle 191               {
3233 09 Apr 15 olle 192                 itemName = itemName.trim();
3233 09 Apr 15 olle 193               }
3233 09 Apr 15 olle 194               list.add(itemName);
3233 09 Apr 15 olle 195             }          
3233 09 Apr 15 olle 196           }
3233 09 Apr 15 olle 197           json.put(jsonKey, JsonUtil.toArray(list, converter));
3233 09 Apr 15 olle 198         }
3233 09 Apr 15 olle 199       }
3233 09 Apr 15 olle 200       else
3233 09 Apr 15 olle 201       {
3233 09 Apr 15 olle 202         json.put(jsonKey, JsonUtil.toArray(annotationType.getAnnotationValues(dc, item), converter));
3233 09 Apr 15 olle 203       }
3233 09 Apr 15 olle 204     }
3233 09 Apr 15 olle 205     catch (PermissionDeniedException ex)
3233 09 Apr 15 olle 206     {
3233 09 Apr 15 olle 207       json.put(jsonKey, "No permission");
3233 09 Apr 15 olle 208     }
3233 09 Apr 15 olle 209     catch (ItemNotFoundException ex)
3233 09 Apr 15 olle 210     {
3233 09 Apr 15 olle 211       json.put(jsonKey, "Not found (may indicate lack of permission)");
3233 09 Apr 15 olle 212     }
3233 09 Apr 15 olle 213     catch (RuntimeException ex)
3233 09 Apr 15 olle 214     {
3233 09 Apr 15 olle 215       json.put(jsonKey, ex.getMessage());
3233 09 Apr 15 olle 216     }
3233 09 Apr 15 olle 217   }
3233 09 Apr 15 olle 218
3233 09 Apr 15 olle 219   /**
2933 14 Nov 14 olle 220     Manually set an annotation value. Or.. actually simply call
2933 14 Nov 14 olle 221     {@link JSONObject#put(Object, Object)} with the given key and value.
2933 14 Nov 14 olle 222   */
2933 14 Nov 14 olle 223   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 224   public void setAnnotation(String jsonKey, Object value)
2933 14 Nov 14 olle 225   {
2933 14 Nov 14 olle 226     JSONObject json = asJSONObject();
2933 14 Nov 14 olle 227     json.put(jsonKey, value);
2933 14 Nov 14 olle 228   }
2933 14 Nov 14 olle 229 }