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 |
An abstract base class for MeLuDI-specific items that have |
2933 |
14 Nov 14 |
olle |
been mapped to BASE items using some special rules. This class |
2933 |
14 Nov 14 |
olle |
can be used on items that are {@link Annotatable} and |
2933 |
14 Nov 14 |
olle |
{@link Nameable}. |
2933 |
14 Nov 14 |
olle |
24 |
|
2933 |
14 Nov 14 |
olle |
@author nicklas |
2933 |
14 Nov 14 |
olle |
@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 |
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 |
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 |
Initialize a JSON object with information. Subclasses |
2933 |
14 Nov 14 |
olle |
should override this method if the need to put in more |
2933 |
14 Nov 14 |
olle |
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 |
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 |
Load annotations for the given annotation type and store the values in |
2933 |
14 Nov 14 |
olle |
the given JSON key. Single-valued annotation types are stored as a simple |
2933 |
14 Nov 14 |
olle |
key-value pair. Multi-valued annotation types are stored as a |
2933 |
14 Nov 14 |
olle |
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 |
Load annotations for the given annotation type and store the values in |
3233 |
09 Apr 15 |
olle |
the given JSON key. Single-valued annotation types are stored as a simple |
3233 |
09 Apr 15 |
olle |
key-value pair. Multi-valued annotation types are stored as a |
3233 |
09 Apr 15 |
olle |
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 |
Load annotations for the given annotation type and store the values in |
3440 |
17 Jul 15 |
olle |
the given JSON key. Single-valued annotation types are stored as a simple |
3440 |
17 Jul 15 |
olle |
key-value pair. Multi-valued annotation types are stored as a |
3440 |
17 Jul 15 |
olle |
key-array pair (even if there is only one value in the array). |
3233 |
09 Apr 15 |
olle |
If flag 'fromListString' is set to 'true', the list is expected to be |
3233 |
09 Apr 15 |
olle |
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 |
Load annotations for the given annotation type and store the values in |
3233 |
09 Apr 15 |
olle |
the given JSON key. Single-valued annotation types are stored as a simple |
3233 |
09 Apr 15 |
olle |
key-value pair. Multi-valued annotation types are stored as a |
3233 |
09 Apr 15 |
olle |
key-array pair (even if there is only one value in the array). |
3233 |
09 Apr 15 |
olle |
If flag 'fromListString' is set to 'true', the list is expected to be |
3233 |
09 Apr 15 |
olle |
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 |
// 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 |
Manually set an annotation value. Or.. actually simply call |
2933 |
14 Nov 14 |
olle |
{@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 |
} |