use of org.xwiki.annotation.AnnotationServiceException in project xwiki-platform by xwiki.
the class AnnotationsRESTResource method doPostAnnotation.
/**
* Add annotation to a given page.
*
* @param wiki the wiki of the document to add annotation on
* @param space the space of the document to add annotation on
* @param page the name of the document to add annotation on
* @param request the request object with the annotation to be added
* @return AnnotationRequestResponse, responseCode = 0 if no error
* @throws XWikiRestException when failing to parse space
*/
@POST
public AnnotationResponse doPostAnnotation(@PathParam("wikiName") String wiki, @PathParam("spaceName") String space, @PathParam("pageName") String page, AnnotationAddRequest request) throws XWikiRestException {
try {
DocumentReference documentReference = new DocumentReference(wiki, parseSpaceSegments(space), page);
// Initialize the context with the correct value.
updateContext(documentReference);
String documentName = referenceSerializer.serialize(documentReference);
// check access to this function
if (!annotationRightService.canAddAnnotation(documentName, getXWikiUser())) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
// add the annotation
Map<String, Object> annotationMetadata = getMap(request.getAnnotation());
annotationService.addAnnotation(documentName, request.getSelection(), request.getSelectionContext(), request.getSelectionOffset(), getXWikiUser(), annotationMetadata);
// and then return the annotated content, as specified by the annotation request
AnnotationResponse response = getSuccessResponseWithAnnotatedContent(documentName, request);
return response;
} catch (AnnotationServiceException e) {
getLogger().error(e.getMessage(), e);
return getErrorResponse(e);
} catch (XWikiException e) {
getLogger().error(e.getMessage(), e);
return getErrorResponse(e);
}
}
use of org.xwiki.annotation.AnnotationServiceException in project xwiki-platform by xwiki.
the class AnnotationsRESTResource method doGetAnnotatedContent.
/**
* @param wiki the wiki of the document to get annotations for
* @param space the space of the document to get annotations for
* @param page the name of the document to get annotation for
* @return annotations of a given XWiki page. Note that we're returning a response holding the AnnotatedContent
* instead of an AnnotatedContent object because we need to be able to set custom expire fields to prevent
* IE from caching this resource.
* @throws XWikiRestException when failing to parse space
*/
@GET
public Response doGetAnnotatedContent(@PathParam("spaceName") String space, @PathParam("pageName") String page, @PathParam("wikiName") String wiki) throws XWikiRestException {
try {
DocumentReference documentReference = new DocumentReference(wiki, parseSpaceSegments(space), page);
// Initialize the context with the correct value.
updateContext(documentReference);
String documentName = referenceSerializer.serialize(documentReference);
// check access to this function
if (!annotationRightService.canViewAnnotatedTarget(documentName, getXWikiUser())) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
// Manually construct the Annotation request entity
// Historically it used to be passed as method argument, but this only worked because of a bug in
// earlier version of Restlet (1.1.x) ; the JAX-RS specification explicitly states that such entity
// parameters "[are] mapped from the request entity body.", and thus cannot be passed to a GET resource.
// See paragraph 3.3.2.1 "Entity Parameters" of JAX-RS 1.1 specification.
Form form = Request.getCurrent().getResourceRef().getQueryAsForm();
AnnotationRequest request = new AnnotationRequest();
AnnotationFieldCollection fields = new AnnotationFieldCollection();
List<AnnotationField> annotationFields = new ArrayList<AnnotationField>();
AnnotationRequest.Request requestedFields = new AnnotationRequest.Request();
for (String name : form.getNames()) {
if (StringUtils.startsWith(name, ANNOTATION_REQUEST_FILTER_PARAMETER_PREFIX)) {
for (String value : form.getValuesArray(name)) {
AnnotationField field = new AnnotationField();
field.setName(StringUtils.substringAfter(name, ANNOTATION_REQUEST_FILTER_PARAMETER_PREFIX));
field.setValue(value);
annotationFields.add(field);
}
} else if (StringUtils.equals(name, ANNOTATION_REQUEST_REQUESTED_FIELD_PARAMETER)) {
requestedFields.getFields().addAll(Arrays.asList(form.getValuesArray(name)));
}
}
request.setRequest(requestedFields);
fields.getFields().addAll(annotationFields);
request.setFilter(fields);
AnnotationResponse response = getSuccessResponseWithAnnotatedContent(documentName, request);
// make this content expire now because cacheControl is not implemented in this version of restlet
return Response.ok(response).expires(new Date()).build();
} catch (AnnotationServiceException e) {
getLogger().error(e.getMessage(), e);
return Response.ok(getErrorResponse(e)).build();
} catch (XWikiException e) {
getLogger().error(e.getMessage(), e);
return Response.ok(getErrorResponse(e)).build();
}
}
use of org.xwiki.annotation.AnnotationServiceException in project xwiki-platform by xwiki.
the class DefaultAnnotationService method addAnnotation.
@Override
public void addAnnotation(String target, String selection, String selectionContext, int offset, String author, Map<String, Object> metadata) throws AnnotationServiceException {
try {
// create the annotation with this data and send it to the storage service
// TODO: also think of mapping the annotation on the document at add time and fail it if it's not mappable,
// for extra security
// TODO: normalize spaces at this level
String leftContext = selectionContext.substring(0, offset);
String rightContext = selectionContext.substring(offset + selection.length());
Annotation annotation = new Annotation(selection, leftContext, rightContext);
annotation.setAuthor(author);
// skip these fields as we don't want to overwrite them with whatever is in this map. Setters should be used
// for these values or constructor
Collection<String> skippedFields = Arrays.asList(new String[] { Annotation.SELECTION_FIELD, Annotation.SELECTION_LEFT_CONTEXT_FIELD, Annotation.SELECTION_RIGHT_CONTEXT_FIELD, Annotation.ORIGINAL_SELECTION_FIELD, Annotation.AUTHOR_FIELD, Annotation.STATE_FIELD });
for (Map.Entry<String, Object> field : metadata.entrySet()) {
if (!skippedFields.contains(field.getKey())) {
annotation.set(field.getKey(), field.getValue());
}
}
ioService.addAnnotation(target, annotation);
} catch (IOServiceException e) {
throw new AnnotationServiceException("An exception occurred when accessing the storage services", e);
}
}
use of org.xwiki.annotation.AnnotationServiceException in project xwiki-platform by xwiki.
the class SingleAnnotationRESTResource method doUpdate.
/**
* Updates the specified annotation with the values of the fields in received collection.
*
* @param space the space of the document to update the annotation from
* @param page the name of the document to update the annotation from
* @param wiki the wiki of the document to update the annotation from
* @param id the id of the annotation to update
* @param updateRequest the request to update the annotation pointed by the id
* @return a annotation response for which the response code will be 0 in case of success and non-zero otherwise
* @throws XWikiRestException when failing to parse space
*/
@PUT
public AnnotationResponse doUpdate(@PathParam("spaceName") String space, @PathParam("pageName") String page, @PathParam("wikiName") String wiki, @PathParam("id") String id, AnnotationUpdateRequest updateRequest) throws XWikiRestException {
try {
DocumentReference documentReference = new DocumentReference(wiki, parseSpaceSegments(space), page);
// Initialize the context with the correct value.
updateContext(documentReference);
String documentName = referenceSerializer.serialize(documentReference);
// check access to this function
if (!annotationRightService.canEditAnnotation(id, documentName, getXWikiUser())) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
// id from the url
Annotation newAnnotation = new Annotation(id);
// fields from the posted content
for (AnnotationField field : updateRequest.getAnnotation().getFields()) {
newAnnotation.set(field.getName(), field.getValue());
}
// overwrite author if any was set because we know better who's logged in
newAnnotation.setAuthor(getXWikiUser());
// and update
annotationService.updateAnnotation(documentName, newAnnotation);
// and then return the annotated content, as specified by the annotation request
AnnotationResponse response = getSuccessResponseWithAnnotatedContent(documentName, updateRequest);
return response;
} catch (XWikiException e) {
getLogger().error(e.getMessage(), e);
return getErrorResponse(e);
} catch (AnnotationServiceException e) {
getLogger().error(e.getMessage(), e);
return getErrorResponse(e);
}
}
use of org.xwiki.annotation.AnnotationServiceException in project xwiki-platform by xwiki.
the class SingleAnnotationRESTResource method doDelete.
/**
* Deletes the specified annotation.
*
* @param space the space of the document to delete the annotation from
* @param page the name of the document to delete the annotation from
* @param wiki the wiki of the document to delete the annotation from
* @param id the id of the annotation to delete
* @param request the annotation request to configure the returned annotated content after the execution of the
* operation
* @return a annotation response for which the response code will be 0 in case of success and non-zero otherwise
* @throws XWikiRestException when failing to parse space
*/
@DELETE
public AnnotationResponse doDelete(@PathParam("spaceName") String space, @PathParam("pageName") String page, @PathParam("wikiName") String wiki, @PathParam("id") String id, AnnotationRequest request) throws XWikiRestException {
try {
DocumentReference documentReference = new DocumentReference(wiki, parseSpaceSegments(space), page);
// Initialize the context with the correct value.
updateContext(documentReference);
String documentName = referenceSerializer.serialize(documentReference);
// check access to this function
if (!annotationRightService.canEditAnnotation(id, documentName, getXWikiUser())) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
// remove the annotation
annotationService.removeAnnotation(documentName, id);
// and then return the annotated content, as specified by the annotation request
AnnotationResponse response = getSuccessResponseWithAnnotatedContent(documentName, request);
return response;
} catch (XWikiException e) {
getLogger().error(e.getMessage(), e);
return getErrorResponse(e);
} catch (AnnotationServiceException e) {
getLogger().error(e.getMessage(), e);
return getErrorResponse(e);
}
}
Aggregations