Mercurial > hg > AnnotationManagerN4J
comparison src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java @ 10:90911b2da322
more work on permissions...
| author | casties |
|---|---|
| date | Thu, 12 Jul 2012 17:01:32 +0200 |
| parents | b2bfc3bc9ba8 |
| children | 629e15b345aa |
comparison
equal
deleted
inserted
replaced
| 9:b2bfc3bc9ba8 | 10:90911b2da322 |
|---|---|
| 34 import org.restlet.resource.ServerResource; | 34 import org.restlet.resource.ServerResource; |
| 35 | 35 |
| 36 import de.mpiwg.itgroup.annotations.Actor; | 36 import de.mpiwg.itgroup.annotations.Actor; |
| 37 import de.mpiwg.itgroup.annotations.Annotation; | 37 import de.mpiwg.itgroup.annotations.Annotation; |
| 38 import de.mpiwg.itgroup.annotations.Annotation.FragmentTypes; | 38 import de.mpiwg.itgroup.annotations.Annotation.FragmentTypes; |
| 39 import de.mpiwg.itgroup.annotations.Group; | |
| 40 import de.mpiwg.itgroup.annotations.Person; | |
| 39 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; | 41 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; |
| 40 import de.mpiwg.itgroup.annotations.old.NS; | 42 import de.mpiwg.itgroup.annotations.old.NS; |
| 41 | 43 |
| 42 /** | 44 /** |
| 43 * Base class for Annotator resource classes. | 45 * Base class for Annotator resource classes. |
| 186 jo.put("uri", annot.getTargetBaseUri()); | 188 jo.put("uri", annot.getTargetBaseUri()); |
| 187 | 189 |
| 188 if (makeUserObject) { | 190 if (makeUserObject) { |
| 189 // create user object | 191 // create user object |
| 190 JSONObject userObject = new JSONObject(); | 192 JSONObject userObject = new JSONObject(); |
| 193 Actor creator = annot.getCreator(); | |
| 191 // save creator as uri | 194 // save creator as uri |
| 192 userObject.put("uri", annot.getCreatorUri()); | 195 userObject.put("uri", creator.getUri()); |
| 193 // make short user id | 196 // make short user id |
| 194 String userId = annot.getCreatorUri(); | 197 String userId = creator.getIdString(); |
| 195 // remove namespace from user uri to get id | |
| 196 if (userId != null && userId.startsWith(NS.MPIWG_PERSONS_URL)) { | |
| 197 userId = userId.replace(NS.MPIWG_PERSONS_URL, ""); | |
| 198 } | |
| 199 // set as id | 198 // set as id |
| 200 userObject.put("id", userId); | 199 userObject.put("id", userId); |
| 201 // get full name | 200 // get full name |
| 202 String userName = annot.getCreatorName(); | 201 String userName = creator.getName(); |
| 203 if (userName == null) { | 202 if (userName == null) { |
| 204 RestServer restServer = (RestServer) getApplication(); | 203 RestServer restServer = (RestServer) getApplication(); |
| 205 userName = restServer.getFullNameFromLdap(userId); | 204 userName = restServer.getFullNameFromLdap(userId); |
| 206 } | 205 } |
| 207 userObject.put("name", userName); | 206 userObject.put("name", userName); |
| 221 jo.put("ranges", transformToRanges(fragments)); | 220 jo.put("ranges", transformToRanges(fragments)); |
| 222 } else if (xt == FragmentTypes.AREA) { | 221 } else if (xt == FragmentTypes.AREA) { |
| 223 jo.put("areas", transformToAreas(fragments)); | 222 jo.put("areas", transformToAreas(fragments)); |
| 224 } | 223 } |
| 225 } | 224 } |
| 225 | |
| 226 // permissions | |
| 227 JSONObject perms = new JSONObject(); | |
| 228 jo.put("permissions", perms); | |
| 229 // admin | |
| 230 JSONArray adminPerms = new JSONArray(); | |
| 231 perms.put("admin", adminPerms); | |
| 232 Actor adminPerm = annot.getAdminPermission(); | |
| 233 if (adminPerm != null) { | |
| 234 adminPerms.put(adminPerm.getIdString()); | |
| 235 } | |
| 236 // delete | |
| 237 JSONArray deletePerms = new JSONArray(); | |
| 238 perms.put("delete", deletePerms); | |
| 239 Actor deletePerm = annot.getDeletePermission(); | |
| 240 if (deletePerm != null) { | |
| 241 deletePerms.put(deletePerm.getIdString()); | |
| 242 } | |
| 243 // update | |
| 244 JSONArray updatePerms = new JSONArray(); | |
| 245 perms.put("update", updatePerms); | |
| 246 Actor updatePerm = annot.getUpdatePermission(); | |
| 247 if (updatePerm != null) { | |
| 248 updatePerms.put(updatePerm.getIdString()); | |
| 249 } | |
| 250 // read | |
| 251 JSONArray readPerms = new JSONArray(); | |
| 252 perms.put("read", readPerms); | |
| 253 Actor readPerm = annot.getReadPermission(); | |
| 254 if (readPerm != null) { | |
| 255 readPerms.put(readPerm.getIdString()); | |
| 256 } | |
| 257 | |
| 226 // encode Annotation URL (=id) in base64 | 258 // encode Annotation URL (=id) in base64 |
| 227 String annotUrl = annot.getUri(); | 259 String annotUrl = annot.getUri(); |
| 228 String annotId = encodeJsonId(annotUrl); | 260 String annotId = encodeJsonId(annotUrl); |
| 229 jo.put("id", annotId); | 261 jo.put("id", annotId); |
| 230 return jo; | 262 return jo; |
| 243 .compile("xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)/range-to\\(end-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)\\)"); | 275 .compile("xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)/range-to\\(end-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)\\)"); |
| 244 Pattern rg1 = Pattern.compile("xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)"); | 276 Pattern rg1 = Pattern.compile("xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)"); |
| 245 | 277 |
| 246 try { | 278 try { |
| 247 for (String xpointer : xpointers) { | 279 for (String xpointer : xpointers) { |
| 248 //String decoded = URLDecoder.decode(xpointer, "utf-8"); | 280 // String decoded = URLDecoder.decode(xpointer, "utf-8"); |
| 249 String decoded = xpointer; | 281 String decoded = xpointer; |
| 250 Matcher m = rg.matcher(decoded); | 282 Matcher m = rg.matcher(decoded); |
| 251 | 283 |
| 252 if (m.find()) { | 284 if (m.find()) { |
| 253 { | 285 { |
| 281 | 313 |
| 282 Pattern rg = Pattern.compile("xywh=(\\w*:)([\\d\\.]+),([\\d\\.]+),([\\d\\.]+),([\\d\\.]+)"); | 314 Pattern rg = Pattern.compile("xywh=(\\w*:)([\\d\\.]+),([\\d\\.]+),([\\d\\.]+),([\\d\\.]+)"); |
| 283 | 315 |
| 284 try { | 316 try { |
| 285 for (String xpointer : xpointers) { | 317 for (String xpointer : xpointers) { |
| 286 //String decoded = URLDecoder.decode(xpointer, "utf-8"); | 318 // String decoded = URLDecoder.decode(xpointer, "utf-8"); |
| 287 String decoded = xpointer; | 319 String decoded = xpointer; |
| 288 Matcher m = rg.matcher(decoded); | 320 Matcher m = rg.matcher(decoded); |
| 289 | 321 |
| 290 if (m.find()) { | 322 if (m.find()) { |
| 291 { | 323 { |
| 292 JSONObject jo = new JSONObject(); | 324 JSONObject jo = new JSONObject(); |
| 325 @SuppressWarnings("unused") | |
| 293 String unit = m.group(1); | 326 String unit = m.group(1); |
| 294 jo.put("x", m.group(2)); | 327 jo.put("x", m.group(2)); |
| 295 jo.put("y", m.group(3)); | 328 jo.put("y", m.group(3)); |
| 296 jo.put("width", m.group(4)); | 329 jo.put("width", m.group(4)); |
| 297 jo.put("height", m.group(5)); | 330 jo.put("height", m.group(5)); |
| 390 */ | 423 */ |
| 391 } | 424 } |
| 392 // get or create creator object | 425 // get or create creator object |
| 393 Actor creator = annot.getCreator(); | 426 Actor creator = annot.getCreator(); |
| 394 if (creator == null) { | 427 if (creator == null) { |
| 395 creator = new Actor(false, null, null); | 428 creator = new Person(); |
| 396 annot.setCreator(creator); | 429 annot.setCreator(creator); |
| 397 } | 430 } |
| 398 // username not required, if no username given authuser will be used | 431 // username not required, if no username given authuser will be used |
| 399 String username = null; | 432 String username = null; |
| 400 String userUri = annot.getCreatorUri(); | 433 String userUri = creator.getUri(); |
| 401 if (jo.has("user")) { | 434 if (jo.has("user")) { |
| 402 if (jo.get("user") instanceof String) { | 435 if (jo.get("user") instanceof String) { |
| 403 // user is just a String | 436 // user is just a String |
| 404 username = jo.getString("user"); | 437 username = jo.getString("user"); |
| 438 creator.setId(username); | |
| 405 // TODO: what if username and authUser are different? | 439 // TODO: what if username and authUser are different? |
| 406 } else { | 440 } else { |
| 407 // user is an object | 441 // user is an object |
| 408 JSONObject user = jo.getJSONObject("user"); | 442 JSONObject user = jo.getJSONObject("user"); |
| 409 if (user.has("id")) { | 443 if (user.has("id")) { |
| 410 username = user.getString("id"); | 444 String id = user.getString("id"); |
| 445 creator.setId(id); | |
| 446 username = id; | |
| 411 } | 447 } |
| 412 if (user.has("uri")) { | 448 if (user.has("uri")) { |
| 413 userUri = user.getString("uri"); | 449 userUri = user.getString("uri"); |
| 414 } | 450 } |
| 415 } | 451 } |
| 433 } | 469 } |
| 434 // TODO: should we overwrite the creator? | 470 // TODO: should we overwrite the creator? |
| 435 if (creator.getUri() == null) { | 471 if (creator.getUri() == null) { |
| 436 creator.setUri(userUri); | 472 creator.setUri(userUri); |
| 437 } | 473 } |
| 438 | 474 |
| 439 if (annot.getCreated() == null) { | 475 if (annot.getCreated() == null) { |
| 440 // set creation date | 476 // set creation date |
| 441 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); | 477 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); |
| 442 String ct = format.format(Calendar.getInstance().getTime()); | 478 String ct = format.format(Calendar.getInstance().getTime()); |
| 443 annot.setCreated(ct); | 479 annot.setCreated(ct); |
| 454 JSONObject area = jo.getJSONArray("areas").getJSONObject(0); | 490 JSONObject area = jo.getJSONArray("areas").getJSONObject(0); |
| 455 annot.setFragmentType(FragmentTypes.AREA); | 491 annot.setFragmentType(FragmentTypes.AREA); |
| 456 String fragment = parseArea(area); | 492 String fragment = parseArea(area); |
| 457 annot.setTargetFragment(fragment); | 493 annot.setTargetFragment(fragment); |
| 458 } | 494 } |
| 495 | |
| 496 // permissions | |
| 497 if (jo.has("permissions")) { | |
| 498 JSONObject permissions = jo.getJSONObject("permissions"); | |
| 499 if (permissions.has("admin")) { | |
| 500 JSONArray perms = permissions.getJSONArray("admin"); | |
| 501 Actor actor = getActorFromPermissions(perms); | |
| 502 annot.setAdminPermission(actor); | |
| 503 } | |
| 504 if (permissions.has("delete")) { | |
| 505 JSONArray perms = permissions.getJSONArray("delete"); | |
| 506 Actor actor = getActorFromPermissions(perms); | |
| 507 annot.setDeletePermission(actor); | |
| 508 } | |
| 509 if (permissions.has("update")) { | |
| 510 JSONArray perms = permissions.getJSONArray("update"); | |
| 511 Actor actor = getActorFromPermissions(perms); | |
| 512 annot.setUpdatePermission(actor); | |
| 513 } | |
| 514 if (permissions.has("read")) { | |
| 515 JSONArray perms = permissions.getJSONArray("read"); | |
| 516 Actor actor = getActorFromPermissions(perms); | |
| 517 annot.setReadPermission(actor); | |
| 518 } | |
| 519 } | |
| 520 | |
| 459 return annot; | 521 return annot; |
| 460 } | 522 } |
| 461 | 523 |
| 524 @SuppressWarnings("unused") | |
| 525 protected Actor getActorFromPermissions(JSONArray perms) throws JSONException { | |
| 526 Actor actor = null; | |
| 527 for (int i = 0; i < perms.length(); ++i) { | |
| 528 String perm = perms.getString(i); | |
| 529 if (perm.toLowerCase().startsWith("group:")) { | |
| 530 String groupId = perm.substring(6); | |
| 531 actor = new Group(groupId); | |
| 532 } else { | |
| 533 actor = new Person(perm); | |
| 534 } | |
| 535 // we just take the first one | |
| 536 break; | |
| 537 } | |
| 538 return actor; | |
| 539 } | |
| 540 | |
| 462 } | 541 } |
