annotate src/de/mpiwg/itgroup/annotationManager/restlet/AddAndSearchAnnotations.java @ 2:6888ae3287b8

changed to namespace handling for users
author dwinter
date Thu, 24 Nov 2011 11:39:12 +0100
parents f2f41d0dedf5
children e5f0906c107c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dwinter
parents:
diff changeset
1 //TODO: handle XML-Post des Annoteaprotocolls http://www.w3.org/2001/Annotea/User/Protocol.html
dwinter
parents:
diff changeset
2
dwinter
parents:
diff changeset
3 package de.mpiwg.itgroup.annotationManager.restlet;
dwinter
parents:
diff changeset
4
dwinter
parents:
diff changeset
5 import java.io.IOException;
dwinter
parents:
diff changeset
6 import java.io.UnsupportedEncodingException;
dwinter
parents:
diff changeset
7 import java.net.URLDecoder;
dwinter
parents:
diff changeset
8 import java.net.URLEncoder;
dwinter
parents:
diff changeset
9 import java.util.ArrayList;
dwinter
parents:
diff changeset
10 import java.util.List;
dwinter
parents:
diff changeset
11 import java.util.regex.Matcher;
dwinter
parents:
diff changeset
12 import java.util.regex.Pattern;
dwinter
parents:
diff changeset
13
dwinter
parents:
diff changeset
14 import org.apache.log4j.Logger;
dwinter
parents:
diff changeset
15 import org.json.JSONArray;
dwinter
parents:
diff changeset
16 import org.json.JSONException;
dwinter
parents:
diff changeset
17 import org.json.JSONObject;
dwinter
parents:
diff changeset
18 import org.restlet.data.ClientInfo;
dwinter
parents:
diff changeset
19 import org.restlet.data.Form;
dwinter
parents:
diff changeset
20 import org.restlet.data.MediaType;
dwinter
parents:
diff changeset
21 import org.restlet.data.Status;
dwinter
parents:
diff changeset
22 import org.restlet.ext.json.JsonRepresentation;
dwinter
parents:
diff changeset
23 import org.restlet.representation.Representation;
dwinter
parents:
diff changeset
24 import org.restlet.representation.StringRepresentation;
dwinter
parents:
diff changeset
25 import org.restlet.resource.Get;
dwinter
parents:
diff changeset
26 import org.restlet.resource.Options;
dwinter
parents:
diff changeset
27 import org.restlet.resource.Post;
dwinter
parents:
diff changeset
28 import org.restlet.resource.ServerResource;
dwinter
parents:
diff changeset
29 import org.restlet.security.User;
dwinter
parents:
diff changeset
30
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
31 import de.mpiwg.itgroup.annotationManager.Constants.NS;
0
dwinter
parents:
diff changeset
32 import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreSearchError;
dwinter
parents:
diff changeset
33 import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreStoreError;
dwinter
parents:
diff changeset
34 import de.mpiwg.itgroup.annotationManager.RDFHandling.Convert;
dwinter
parents:
diff changeset
35 import de.mpiwg.itgroup.annotationManager.RDFHandling.Convert.Annotation;
dwinter
parents:
diff changeset
36 import de.mpiwg.itgroup.annotationManager.RDFHandling.RDFSearcher;
dwinter
parents:
diff changeset
37 import de.mpiwg.itgroup.nimanager.exceptions.TripleStoreHandlerException;
dwinter
parents:
diff changeset
38
dwinter
parents:
diff changeset
39 public class AddAndSearchAnnotations extends ServerResource {
dwinter
parents:
diff changeset
40
dwinter
parents:
diff changeset
41 private Logger logger = Logger.getRootLogger();
dwinter
parents:
diff changeset
42
dwinter
parents:
diff changeset
43 /**
dwinter
parents:
diff changeset
44 *
dwinter
parents:
diff changeset
45 * json hash: username: name des users xpointer: xpointer auf den Ausschnitt
dwinter
parents:
diff changeset
46 * (incl. der URL des Dokumentes) text: text der annotation annoturl: url
dwinter
parents:
diff changeset
47 * auf eine Annotation falls extern
dwinter
parents:
diff changeset
48 *
dwinter
parents:
diff changeset
49 * @return
dwinter
parents:
diff changeset
50 */
dwinter
parents:
diff changeset
51
dwinter
parents:
diff changeset
52
dwinter
parents:
diff changeset
53 @Options
dwinter
parents:
diff changeset
54 public void doOptions(Representation entity) {
dwinter
parents:
diff changeset
55 Form responseHeaders = (Form) getResponse().getAttributes().get(
dwinter
parents:
diff changeset
56 "org.restlet.http.headers");
dwinter
parents:
diff changeset
57 if (responseHeaders == null) {
dwinter
parents:
diff changeset
58 responseHeaders = new Form();
dwinter
parents:
diff changeset
59 getResponse().getAttributes().put("org.restlet.http.headers",
dwinter
parents:
diff changeset
60 responseHeaders);
dwinter
parents:
diff changeset
61 }
dwinter
parents:
diff changeset
62 responseHeaders.add("Access-Control-Allow-Origin", "*");
dwinter
parents:
diff changeset
63 responseHeaders.add("Access-Control-Allow-Methods", "POST,OPTIONS,GET");
dwinter
parents:
diff changeset
64 responseHeaders.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Annotator-Account-Id, X-Annotator-User-Id, X-Annotator-Auth-Token-Valid-Until, X-Annotator-Auth-Token");
dwinter
parents:
diff changeset
65 responseHeaders.add("Access-Control-Allow-Credentials", "false");
dwinter
parents:
diff changeset
66 responseHeaders.add("Access-Control-Max-Age", "60");
dwinter
parents:
diff changeset
67 }
dwinter
parents:
diff changeset
68
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
69 @Get("html")
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
70 public Representation doGetHTML(Representation entity){
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
71
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
72 doOptions(entity);
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
73 Form form = getRequest().getResourceRef().getQueryAsForm();
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
74 String uri = form.getFirstValue("uri");
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
75 String user = form.getFirstValue("user");
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
76
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
77 String limit=form.getFirstValue("limit");
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
78 String offset=form.getFirstValue("offset");
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
79
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
80
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
81 //
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
82 RDFSearcher searcher = new RDFSearcher("file:///annotations"); //TODO should ge into config file
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
83
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
84 String retString="<html><body><table>";
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
85 String lineFormat="<tr><td>%s</td>" +
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
86 "<td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td><td><a href=\"%s\">%s</a></td><td><a href=\"%s\">%s</a></td></div>";
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
87 try {
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
88
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
89 List<Convert.Annotation> annots=searcher.search(uri,user,limit,offset);
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
90
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
91 for (Convert.Annotation annot:annots){
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
92
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
93
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
94 RestServer restServer = (RestServer) getApplication();
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
95 String userName=restServer.getUserNameFromLdap(annot.creator);
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
96 List<String> xpointer = new ArrayList<String>();
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
97
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
98 if (annot.xpointers==null || annot.xpointers.size()==0)
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
99 retString+=String.format(lineFormat, userName,annot.url,annot.url,annot.time,annot.text,annot.xpointer,annot.xpointer,annot.annotationUri,annot.annotationUri);
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
100 else {
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
101 for(String xpointerString:annot.xpointers){
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
102 retString+=String.format(lineFormat, userName,annot.url,annot.url,annot.time,annot.text,xpointerString,xpointerString,annot.annotationUri,annot.annotationUri);
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
103
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
104 }
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
105 }
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
106
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
107 }
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
108 } catch (TripleStoreHandlerException e) {
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
109 // TODO Auto-generated catch block
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
110 e.printStackTrace();
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
111 setStatus(Status.SERVER_ERROR_INTERNAL,"TripleStoreHandler Error");
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
112 return null;
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
113 } catch (TripleStoreSearchError e) {
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
114 // TODO Auto-generated catch block
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
115 e.printStackTrace();
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
116 setStatus(Status.SERVER_ERROR_INTERNAL,"TripleStoreSearch Error");
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
117 return null;
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
118 }
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
119
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
120 retString+="</table></body></html>";
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
121
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
122 logger.debug("sending:");
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
123 logger.debug(retString);
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
124 return new StringRepresentation(retString,MediaType.TEXT_HTML);
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
125 }
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
126
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
127
0
dwinter
parents:
diff changeset
128 @Get("json")
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
129 public Representation doGetJSON(Representation entity){
0
dwinter
parents:
diff changeset
130
dwinter
parents:
diff changeset
131 doOptions(entity);
dwinter
parents:
diff changeset
132 Form form = getRequest().getResourceRef().getQueryAsForm();
dwinter
parents:
diff changeset
133 String uri = form.getFirstValue("uri");
dwinter
parents:
diff changeset
134 String user = form.getFirstValue("user");
dwinter
parents:
diff changeset
135
dwinter
parents:
diff changeset
136 String limit=form.getFirstValue("limit");
dwinter
parents:
diff changeset
137 String offset=form.getFirstValue("offset");
dwinter
parents:
diff changeset
138
dwinter
parents:
diff changeset
139
dwinter
parents:
diff changeset
140 //
dwinter
parents:
diff changeset
141 RDFSearcher searcher = new RDFSearcher("file:///annotations"); //TODO should ge into config file
dwinter
parents:
diff changeset
142
dwinter
parents:
diff changeset
143 JSONArray ja;
dwinter
parents:
diff changeset
144 try {
dwinter
parents:
diff changeset
145
dwinter
parents:
diff changeset
146 List<Convert.Annotation> annots=searcher.search(uri,user,limit,offset);
dwinter
parents:
diff changeset
147
dwinter
parents:
diff changeset
148 ja = new JSONArray();
dwinter
parents:
diff changeset
149 for (Convert.Annotation annot:annots){
dwinter
parents:
diff changeset
150 JSONObject jo = new JSONObject();
dwinter
parents:
diff changeset
151 jo.put("text", annot.text);
dwinter
parents:
diff changeset
152 jo.put("uri",annot.url);
dwinter
parents:
diff changeset
153
dwinter
parents:
diff changeset
154 JSONObject userObject= new JSONObject();
dwinter
parents:
diff changeset
155 userObject.put("id",annot.creator);
dwinter
parents:
diff changeset
156
dwinter
parents:
diff changeset
157 RestServer restServer = (RestServer) getApplication();
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
158
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
159 String userID= annot.creator;
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
160 if (userID.startsWith(NS.MPIWG_PERSONS)){
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
161 userID=userID.replace(NS.MPIWG_PERSONS, ""); //entferne NAMESPACE
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
162 }
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
163 String userName=restServer.getUserNameFromLdap(userID);
0
dwinter
parents:
diff changeset
164 userObject.put("name",userName);
dwinter
parents:
diff changeset
165
dwinter
parents:
diff changeset
166 jo.put("user",userObject);
dwinter
parents:
diff changeset
167
dwinter
parents:
diff changeset
168 List<String> xpointer = new ArrayList<String>();
dwinter
parents:
diff changeset
169
dwinter
parents:
diff changeset
170 if (annot.xpointers==null || annot.xpointers.size()==0)
dwinter
parents:
diff changeset
171 xpointer.add(annot.xpointer);
dwinter
parents:
diff changeset
172 else {
dwinter
parents:
diff changeset
173 for(String xpointerString:annot.xpointers){
dwinter
parents:
diff changeset
174 xpointer.add(xpointerString);
dwinter
parents:
diff changeset
175 }
dwinter
parents:
diff changeset
176 }
dwinter
parents:
diff changeset
177 jo.put("ranges", transformToRanges(xpointer));
dwinter
parents:
diff changeset
178 ja.put(jo);
dwinter
parents:
diff changeset
179 }
dwinter
parents:
diff changeset
180 } catch (TripleStoreHandlerException e) {
dwinter
parents:
diff changeset
181 // TODO Auto-generated catch block
dwinter
parents:
diff changeset
182 e.printStackTrace();
dwinter
parents:
diff changeset
183 setStatus(Status.SERVER_ERROR_INTERNAL,"TripleStoreHandler Error");
dwinter
parents:
diff changeset
184 return null;
dwinter
parents:
diff changeset
185 } catch (TripleStoreSearchError e) {
dwinter
parents:
diff changeset
186 // TODO Auto-generated catch block
dwinter
parents:
diff changeset
187 e.printStackTrace();
dwinter
parents:
diff changeset
188 setStatus(Status.SERVER_ERROR_INTERNAL,"TripleStoreSearch Error");
dwinter
parents:
diff changeset
189 return null;
dwinter
parents:
diff changeset
190 } catch (JSONException e) {
dwinter
parents:
diff changeset
191 // TODO Auto-generated catch block
dwinter
parents:
diff changeset
192 e.printStackTrace();
dwinter
parents:
diff changeset
193 setStatus(Status.SERVER_ERROR_INTERNAL,"JSon Error");
dwinter
parents:
diff changeset
194 return null;
dwinter
parents:
diff changeset
195 }
dwinter
parents:
diff changeset
196
dwinter
parents:
diff changeset
197 JSONObject retObject = new JSONObject();
dwinter
parents:
diff changeset
198 try {
dwinter
parents:
diff changeset
199 retObject.put("rows",ja);
dwinter
parents:
diff changeset
200 retObject.put("total",ja.length());
dwinter
parents:
diff changeset
201 } catch (JSONException e) {
dwinter
parents:
diff changeset
202 // TODO Auto-generated catch block
dwinter
parents:
diff changeset
203 e.printStackTrace();
dwinter
parents:
diff changeset
204 setStatus(Status.SERVER_ERROR_INTERNAL,"JSon Error");
dwinter
parents:
diff changeset
205 return null;
dwinter
parents:
diff changeset
206 }
dwinter
parents:
diff changeset
207
dwinter
parents:
diff changeset
208 logger.debug("sending:");
dwinter
parents:
diff changeset
209 logger.debug(retObject);
dwinter
parents:
diff changeset
210 return new JsonRepresentation(retObject);
dwinter
parents:
diff changeset
211 }
dwinter
parents:
diff changeset
212
dwinter
parents:
diff changeset
213 private JSONArray transformToRanges(List<String> xpointers) {
dwinter
parents:
diff changeset
214
dwinter
parents:
diff changeset
215 JSONArray ja = new JSONArray();
dwinter
parents:
diff changeset
216
dwinter
parents:
diff changeset
217 Pattern rg = Pattern.compile("#xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)/range-to\\(end-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)\\)");
dwinter
parents:
diff changeset
218 Pattern rg1 = Pattern.compile("#xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)");
dwinter
parents:
diff changeset
219
dwinter
parents:
diff changeset
220
dwinter
parents:
diff changeset
221
dwinter
parents:
diff changeset
222 try {
dwinter
parents:
diff changeset
223 for(String xpointer:xpointers){
dwinter
parents:
diff changeset
224 String decoded =URLDecoder.decode(xpointer,"utf-8");
dwinter
parents:
diff changeset
225 Matcher m=rg.matcher(decoded);
1
f2f41d0dedf5 minimal changes
dwinter
parents: 0
diff changeset
226
f2f41d0dedf5 minimal changes
dwinter
parents: 0
diff changeset
227 if (m.find()){
0
dwinter
parents:
diff changeset
228 {
dwinter
parents:
diff changeset
229 JSONObject jo = new JSONObject();
dwinter
parents:
diff changeset
230 jo.put("start", m.group(1));
dwinter
parents:
diff changeset
231 jo.put("startOffset", m.group(2));
dwinter
parents:
diff changeset
232 jo.put("end", m.group(3));
dwinter
parents:
diff changeset
233 jo.put("endOffset", m.group(4));
dwinter
parents:
diff changeset
234 ja.put(jo);
1
f2f41d0dedf5 minimal changes
dwinter
parents: 0
diff changeset
235 }
0
dwinter
parents:
diff changeset
236 }
dwinter
parents:
diff changeset
237 m=rg1.matcher(xpointer);
1
f2f41d0dedf5 minimal changes
dwinter
parents: 0
diff changeset
238 if (m.find()){
0
dwinter
parents:
diff changeset
239 JSONObject jo = new JSONObject();
dwinter
parents:
diff changeset
240 jo.put("start", m.group(1));
dwinter
parents:
diff changeset
241 jo.put("startOffset", m.group(2));
dwinter
parents:
diff changeset
242
dwinter
parents:
diff changeset
243 ja.put(jo);
dwinter
parents:
diff changeset
244 }
dwinter
parents:
diff changeset
245
dwinter
parents:
diff changeset
246
dwinter
parents:
diff changeset
247 }
dwinter
parents:
diff changeset
248 } catch (JSONException e) {
dwinter
parents:
diff changeset
249 // TODO Auto-generated catch block
dwinter
parents:
diff changeset
250 e.printStackTrace();
dwinter
parents:
diff changeset
251 } catch (UnsupportedEncodingException e) {
dwinter
parents:
diff changeset
252 // TODO Auto-generated catch block
dwinter
parents:
diff changeset
253 e.printStackTrace();
dwinter
parents:
diff changeset
254 }
dwinter
parents:
diff changeset
255
dwinter
parents:
diff changeset
256
dwinter
parents:
diff changeset
257 return ja;
dwinter
parents:
diff changeset
258
dwinter
parents:
diff changeset
259
dwinter
parents:
diff changeset
260
dwinter
parents:
diff changeset
261
dwinter
parents:
diff changeset
262
dwinter
parents:
diff changeset
263 }
dwinter
parents:
diff changeset
264
dwinter
parents:
diff changeset
265 @Post("json")
dwinter
parents:
diff changeset
266 public Representation doPostJson(Representation entity) {
dwinter
parents:
diff changeset
267
dwinter
parents:
diff changeset
268 String retVal = doPost(entity);
dwinter
parents:
diff changeset
269 JSONObject jo;
dwinter
parents:
diff changeset
270 try {
dwinter
parents:
diff changeset
271 jo = new JSONObject("{\"annotUrl\":\"" + retVal + "\"}");
dwinter
parents:
diff changeset
272 } catch (JSONException e) {
dwinter
parents:
diff changeset
273 setStatus(Status.SERVER_ERROR_INTERNAL);
dwinter
parents:
diff changeset
274 return null;
dwinter
parents:
diff changeset
275 }
dwinter
parents:
diff changeset
276 JsonRepresentation retRep = new JsonRepresentation(jo);
dwinter
parents:
diff changeset
277 return retRep;
dwinter
parents:
diff changeset
278 }
dwinter
parents:
diff changeset
279
dwinter
parents:
diff changeset
280 @Post("html")
dwinter
parents:
diff changeset
281 public Representation doPostHtml(Representation entity) {
dwinter
parents:
diff changeset
282 String retVal = doPost(entity);
dwinter
parents:
diff changeset
283 if (retVal == null) {
dwinter
parents:
diff changeset
284 return null;
dwinter
parents:
diff changeset
285 }
dwinter
parents:
diff changeset
286 String text = String.format(
dwinter
parents:
diff changeset
287 "<html><body><a href=\"%s\">%s</a></body></html>", retVal
dwinter
parents:
diff changeset
288 .replace(">", "").replace("<", ""),
dwinter
parents:
diff changeset
289 retVal.replace(">", "&gt;").replace("<", "&lt;"));
dwinter
parents:
diff changeset
290 Representation retRep = new StringRepresentation(text,
dwinter
parents:
diff changeset
291 MediaType.TEXT_HTML);
dwinter
parents:
diff changeset
292 return retRep;
dwinter
parents:
diff changeset
293 }
dwinter
parents:
diff changeset
294
dwinter
parents:
diff changeset
295 public String doPost(Representation entity) {
dwinter
parents:
diff changeset
296 Convert.Annotation annot;
dwinter
parents:
diff changeset
297 // versuche basic authentifizierung und hole den Benutzer von dort.
dwinter
parents:
diff changeset
298
dwinter
parents:
diff changeset
299 // User authUser;= handleBasicAuthentification(entity);
dwinter
parents:
diff changeset
300
dwinter
parents:
diff changeset
301 if (entity.getMediaType().equals(MediaType.APPLICATION_JSON)) {
dwinter
parents:
diff changeset
302
dwinter
parents:
diff changeset
303 JsonRepresentation jrep;
dwinter
parents:
diff changeset
304 try {
dwinter
parents:
diff changeset
305 jrep = new JsonRepresentation(entity);
dwinter
parents:
diff changeset
306 } catch (IOException e1) {
dwinter
parents:
diff changeset
307 setStatus(Status.SERVER_ERROR_INTERNAL);
dwinter
parents:
diff changeset
308 return null;
dwinter
parents:
diff changeset
309 }
dwinter
parents:
diff changeset
310
dwinter
parents:
diff changeset
311 // try {
dwinter
parents:
diff changeset
312 // logger.debug(jrep.getText());
dwinter
parents:
diff changeset
313 // } catch (IOException e1) {
dwinter
parents:
diff changeset
314 // // TODO Auto-generated catch block
dwinter
parents:
diff changeset
315 // e1.printStackTrace();
dwinter
parents:
diff changeset
316 // }
dwinter
parents:
diff changeset
317 //
dwinter
parents:
diff changeset
318
dwinter
parents:
diff changeset
319 try {
dwinter
parents:
diff changeset
320 JSONObject jo = jrep.getJsonObject();
dwinter
parents:
diff changeset
321 String mode = jo.getString("mode"); // hole modus
dwinter
parents:
diff changeset
322 if (mode==null || mode.equals(""))
dwinter
parents:
diff changeset
323 mode="annotea"; // default mode (annotea) TODO make this configurable
dwinter
parents:
diff changeset
324
dwinter
parents:
diff changeset
325 if (mode.equals("annotator") ) { // annotator format
dwinter
parents:
diff changeset
326 annot = handleAnnotatorSchema(jo, entity);
dwinter
parents:
diff changeset
327 logger.debug("storing annotator object");
dwinter
parents:
diff changeset
328 logger.debug(jo);
dwinter
parents:
diff changeset
329 } else if (mode.equals("annotea")){
dwinter
parents:
diff changeset
330 annot = handleAnnotea(jo, entity);
dwinter
parents:
diff changeset
331 } else {
dwinter
parents:
diff changeset
332 setStatus(Status.CLIENT_ERROR_BAD_REQUEST,"mode "+mode+"not supported!");
dwinter
parents:
diff changeset
333 return null;
dwinter
parents:
diff changeset
334 }
dwinter
parents:
diff changeset
335
dwinter
parents:
diff changeset
336 } catch (JSONException e) {
dwinter
parents:
diff changeset
337 setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
dwinter
parents:
diff changeset
338 return null;
dwinter
parents:
diff changeset
339 }
dwinter
parents:
diff changeset
340
dwinter
parents:
diff changeset
341 } else if (entity.getMediaType().equals(MediaType.APPLICATION_WWW_FORM)) {
dwinter
parents:
diff changeset
342 annot = handleForm(entity);
dwinter
parents:
diff changeset
343
dwinter
parents:
diff changeset
344 } else {
dwinter
parents:
diff changeset
345 setStatus(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
dwinter
parents:
diff changeset
346
dwinter
parents:
diff changeset
347 return null;
dwinter
parents:
diff changeset
348 }
dwinter
parents:
diff changeset
349
dwinter
parents:
diff changeset
350 if (annot==null){
dwinter
parents:
diff changeset
351 return null;
dwinter
parents:
diff changeset
352 }
dwinter
parents:
diff changeset
353 if (annot.xpointer == null || annot.creator == null) {
dwinter
parents:
diff changeset
354 setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
dwinter
parents:
diff changeset
355
dwinter
parents:
diff changeset
356 return null;
dwinter
parents:
diff changeset
357 }
dwinter
parents:
diff changeset
358
dwinter
parents:
diff changeset
359
dwinter
parents:
diff changeset
360
dwinter
parents:
diff changeset
361 try {
dwinter
parents:
diff changeset
362 return new Convert("file:///annotations").storeAnnotation(annot);
dwinter
parents:
diff changeset
363 } catch (TripleStoreStoreError e) {
dwinter
parents:
diff changeset
364 e.printStackTrace();
dwinter
parents:
diff changeset
365 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStore Error");
dwinter
parents:
diff changeset
366 return null;
dwinter
parents:
diff changeset
367 }
dwinter
parents:
diff changeset
368 }
dwinter
parents:
diff changeset
369
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
370
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
371 /**
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
372 *
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
373 * @param entity should contain a form with the parameters "username", "password", "xpointer","text","uri","type"
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
374 *
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
375 * username,password is optional, if not given BasicAuthentification is used.
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
376 *
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
377 *
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
378 *
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
379 * If username given as a URI, the username will be transformed to an URI, username will be added to the MPIWG namespace defined in de.mpiwg.itgroup.annotationManager.Constants.NS
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
380 *
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
381 * @return
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
382 */
0
dwinter
parents:
diff changeset
383 protected Convert.Annotation handleForm(Representation entity) {
dwinter
parents:
diff changeset
384 Convert.Annotation annot;
dwinter
parents:
diff changeset
385 Form form = new Form(entity);
dwinter
parents:
diff changeset
386 String username = form.getValues("username");
dwinter
parents:
diff changeset
387 String password = form.getValues("password");
dwinter
parents:
diff changeset
388 String xpointer = form.getValues("xpointer");
dwinter
parents:
diff changeset
389 String text = form.getValues("text");
dwinter
parents:
diff changeset
390 String url = form.getValues("url");
dwinter
parents:
diff changeset
391 String type = form.getValues("type");
dwinter
parents:
diff changeset
392 RestServer restServer = (RestServer) getApplication();
dwinter
parents:
diff changeset
393
dwinter
parents:
diff changeset
394 // falls user and password nicht null sind:
dwinter
parents:
diff changeset
395 User userFromForm = null;
dwinter
parents:
diff changeset
396 if (username != null && password != null) {
dwinter
parents:
diff changeset
397 if (restServer.authenticate(username, password, getRequest())) {
dwinter
parents:
diff changeset
398 userFromForm = new User(username);
dwinter
parents:
diff changeset
399 }
dwinter
parents:
diff changeset
400 }
dwinter
parents:
diff changeset
401 User authUser = null;
dwinter
parents:
diff changeset
402
dwinter
parents:
diff changeset
403 if (userFromForm == null) {
dwinter
parents:
diff changeset
404 authUser = handleBasicAuthentification(entity);
dwinter
parents:
diff changeset
405 }
dwinter
parents:
diff changeset
406
dwinter
parents:
diff changeset
407 // weder BasicAuth noch FormAuth
dwinter
parents:
diff changeset
408 if (authUser == null && userFromForm == null) {
dwinter
parents:
diff changeset
409 setStatus(Status.CLIENT_ERROR_FORBIDDEN);
dwinter
parents:
diff changeset
410 return null;
dwinter
parents:
diff changeset
411 }
dwinter
parents:
diff changeset
412
dwinter
parents:
diff changeset
413 if (userFromForm != null) {
dwinter
parents:
diff changeset
414 username = userFromForm.getIdentifier();
dwinter
parents:
diff changeset
415 } else {
dwinter
parents:
diff changeset
416 username = authUser.getIdentifier();
dwinter
parents:
diff changeset
417 }
dwinter
parents:
diff changeset
418
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
419 //username should be a URI, if not it will set to the MPIWG namespace defined in de.mpiwg.itgroup.annotationManager.Constants.NS
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
420 if (!username.startsWith("http"))
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
421 username=NS.MPIWG_PERSONS+username;
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
422
0
dwinter
parents:
diff changeset
423 annot = new Convert.Annotation(xpointer, username, null, text,
dwinter
parents:
diff changeset
424 type, url);
dwinter
parents:
diff changeset
425 return annot;
dwinter
parents:
diff changeset
426 }
dwinter
parents:
diff changeset
427
dwinter
parents:
diff changeset
428 @Post
dwinter
parents:
diff changeset
429 public Representation doPostHtml2(Representation entity) {
dwinter
parents:
diff changeset
430 return doPostHtml(entity);
dwinter
parents:
diff changeset
431 }
dwinter
parents:
diff changeset
432
dwinter
parents:
diff changeset
433 private User handleBasicAuthentification(Representation entity) {
dwinter
parents:
diff changeset
434 RestServer restServer = (RestServer) getApplication();
dwinter
parents:
diff changeset
435 if (!restServer.authenticate(getRequest(), getResponse())) {
dwinter
parents:
diff changeset
436 // Not authenticated
dwinter
parents:
diff changeset
437 return null;
dwinter
parents:
diff changeset
438 }
dwinter
parents:
diff changeset
439
dwinter
parents:
diff changeset
440 ClientInfo ci = getRequest().getClientInfo();
dwinter
parents:
diff changeset
441 logger.debug(ci);
dwinter
parents:
diff changeset
442 return getRequest().getClientInfo().getUser();
dwinter
parents:
diff changeset
443
dwinter
parents:
diff changeset
444 }
dwinter
parents:
diff changeset
445
dwinter
parents:
diff changeset
446 /**
dwinter
parents:
diff changeset
447 * using a minimal annotation format based on the annotea specification
dwinter
parents:
diff changeset
448 *
dwinter
parents:
diff changeset
449 * @param jo
dwinter
parents:
diff changeset
450 * must contain xpointer, text,url,type and can contain a
dwinter
parents:
diff changeset
451 * username, if not the username form the authentification will
dwinter
parents:
diff changeset
452 * be used.
dwinter
parents:
diff changeset
453 * @param authUser
dwinter
parents:
diff changeset
454 * user object
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
455 * The username will be transformed to an URI if not given already as URI, if not it will set to the MPIWG namespace defined in de.mpiwg.itgroup.annotationManager.Constants.NS
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
456
0
dwinter
parents:
diff changeset
457 * @return
dwinter
parents:
diff changeset
458 * @throws JSONException
dwinter
parents:
diff changeset
459 */
dwinter
parents:
diff changeset
460 public Annotation handleAnnotea(JSONObject jo, Representation entity)
dwinter
parents:
diff changeset
461 throws JSONException {
dwinter
parents:
diff changeset
462
dwinter
parents:
diff changeset
463 User authUser = handleBasicAuthentification(entity);
dwinter
parents:
diff changeset
464 String username = jo.getString("username"); // not required, if no
dwinter
parents:
diff changeset
465 // username given authuser
dwinter
parents:
diff changeset
466 // will be used.
dwinter
parents:
diff changeset
467 String xpointer = jo.getString("xpointer");
dwinter
parents:
diff changeset
468 String text = null;
dwinter
parents:
diff changeset
469 if (jo.has("text"))
dwinter
parents:
diff changeset
470 text = jo.getString("text");
dwinter
parents:
diff changeset
471
dwinter
parents:
diff changeset
472 String url = null;
dwinter
parents:
diff changeset
473 if (jo.has("url"))
dwinter
parents:
diff changeset
474 url = jo.getString("url");
dwinter
parents:
diff changeset
475
dwinter
parents:
diff changeset
476 String type = null;
dwinter
parents:
diff changeset
477 if (jo.has("type"))
dwinter
parents:
diff changeset
478 type = jo.getString("type");
dwinter
parents:
diff changeset
479
dwinter
parents:
diff changeset
480 if (username == null)
dwinter
parents:
diff changeset
481 username = authUser.getIdentifier();
dwinter
parents:
diff changeset
482
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
483 //username should be a URI, if not it will set to the MPIWG namespace defined in de.mpiwg.itgroup.annotationManager.Constants.NS
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
484 if (!username.startsWith("http"))
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
485 username=NS.MPIWG_PERSONS+username;
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
486
0
dwinter
parents:
diff changeset
487 return new Convert.Annotation(xpointer, username, null, text, type, url);
dwinter
parents:
diff changeset
488 }
dwinter
parents:
diff changeset
489
dwinter
parents:
diff changeset
490 /**
dwinter
parents:
diff changeset
491 * uses the specification from the annotator project.
dwinter
parents:
diff changeset
492 *
dwinter
parents:
diff changeset
493 * @see{https://github.com/okfn/annotator/wiki/Annotation-format The user
dwinter
parents:
diff changeset
494 * object must
dwinter
parents:
diff changeset
495 * contain an
dwinter
parents:
diff changeset
496 * id and
dwinter
parents:
diff changeset
497 * password or
dwinter
parents:
diff changeset
498 * basic
dwinter
parents:
diff changeset
499 * authentification
dwinter
parents:
diff changeset
500 * is used.
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
501 * The username will be transformed to an URI if not given already as URI, if not it will set to the MPIWG namespace defined in de.mpiwg.itgroup.annotationManager.Constants.NS
0
dwinter
parents:
diff changeset
502 * @param jo
dwinter
parents:
diff changeset
503 * @param authUser
dwinter
parents:
diff changeset
504 * @return
dwinter
parents:
diff changeset
505 * @throws JSONException
dwinter
parents:
diff changeset
506 */
dwinter
parents:
diff changeset
507 public Convert.Annotation handleAnnotatorSchema(JSONObject jo,
dwinter
parents:
diff changeset
508 Representation entity) throws JSONException {
dwinter
parents:
diff changeset
509 Convert.Annotation annot;
dwinter
parents:
diff changeset
510 String url = jo.getString("uri");
dwinter
parents:
diff changeset
511 String text = jo.getString("text");
dwinter
parents:
diff changeset
512
dwinter
parents:
diff changeset
513 String username = null;
dwinter
parents:
diff changeset
514 if (jo.has("user")) { // not required, if no username given authuser
dwinter
parents:
diff changeset
515 // will be used otherwise username and password
dwinter
parents:
diff changeset
516 // has to be submitted
dwinter
parents:
diff changeset
517 JSONObject user = jo.getJSONObject("user");
dwinter
parents:
diff changeset
518 if (user.has("id")) {
dwinter
parents:
diff changeset
519 username = user.getString("id");
dwinter
parents:
diff changeset
520 if(!user.has("password")){
dwinter
parents:
diff changeset
521 User authUser = handleBasicAuthentification(entity);
dwinter
parents:
diff changeset
522 if (authUser==null){
dwinter
parents:
diff changeset
523 setStatus(Status.CLIENT_ERROR_FORBIDDEN);
dwinter
parents:
diff changeset
524 return null;
dwinter
parents:
diff changeset
525 }
dwinter
parents:
diff changeset
526 username = authUser.getIdentifier();
dwinter
parents:
diff changeset
527 } else {
dwinter
parents:
diff changeset
528 String password = user.getString("password");
dwinter
parents:
diff changeset
529 if (!((RestServer) getApplication()).authenticate(username,
dwinter
parents:
diff changeset
530 password, getRequest())) {
dwinter
parents:
diff changeset
531 setStatus(Status.CLIENT_ERROR_FORBIDDEN);
dwinter
parents:
diff changeset
532 return null;
dwinter
parents:
diff changeset
533 }
dwinter
parents:
diff changeset
534 }
dwinter
parents:
diff changeset
535 }
dwinter
parents:
diff changeset
536
dwinter
parents:
diff changeset
537 } else {
dwinter
parents:
diff changeset
538 User authUser = handleBasicAuthentification(entity);
dwinter
parents:
diff changeset
539 if (authUser == null) {
dwinter
parents:
diff changeset
540 setStatus(Status.CLIENT_ERROR_FORBIDDEN);
dwinter
parents:
diff changeset
541 return null;
dwinter
parents:
diff changeset
542 }
dwinter
parents:
diff changeset
543 username = authUser.getIdentifier();
dwinter
parents:
diff changeset
544 }
dwinter
parents:
diff changeset
545
dwinter
parents:
diff changeset
546 String xpointer;
dwinter
parents:
diff changeset
547 if (jo.has("ranges")) {
dwinter
parents:
diff changeset
548 JSONObject ranges = jo.getJSONArray("ranges").getJSONObject(0);
dwinter
parents:
diff changeset
549 String start = ranges.getString("start");
dwinter
parents:
diff changeset
550 String end = ranges.getString("end");
dwinter
parents:
diff changeset
551 String startOffset = ranges.getString("startOffset");
dwinter
parents:
diff changeset
552 String endOffset = ranges.getString("endOffset");
dwinter
parents:
diff changeset
553
dwinter
parents:
diff changeset
554 try {
dwinter
parents:
diff changeset
555 xpointer = url+"#"+
dwinter
parents:
diff changeset
556 URLEncoder.encode(String.format(
dwinter
parents:
diff changeset
557 "xpointer(start-point(string-range(\"%s\",%s,1))/range-to(end-point(string-range(\"%s\",%s,1))))",
dwinter
parents:
diff changeset
558 start, startOffset, end, endOffset),"utf-8");
dwinter
parents:
diff changeset
559 } catch (UnsupportedEncodingException e) {
dwinter
parents:
diff changeset
560 e.printStackTrace();
dwinter
parents:
diff changeset
561 setStatus(Status.SERVER_ERROR_INTERNAL);
dwinter
parents:
diff changeset
562 return null;
dwinter
parents:
diff changeset
563 }
dwinter
parents:
diff changeset
564 } else {
dwinter
parents:
diff changeset
565 xpointer = url;
dwinter
parents:
diff changeset
566 }
2
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
567
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
568 //username should be a URI, if not it will set to the MPIWG namespace defined in de.mpiwg.itgroup.annotationManager.Constants.NS
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
569 if (!username.startsWith("http"))
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
570 username=NS.MPIWG_PERSONS+username;
6888ae3287b8 changed to namespace handling for users
dwinter
parents: 1
diff changeset
571
0
dwinter
parents:
diff changeset
572 return new Convert.Annotation(xpointer, username, null, text, null);
dwinter
parents:
diff changeset
573 }
dwinter
parents:
diff changeset
574
dwinter
parents:
diff changeset
575 }