close

Filter

loading table of contents...

Studio Developer Manual / Version 2404

Table Of Contents

9.21.2.1 Developing Write Interceptors

In order to process write requests as described above, create a class implementing the interface ContentWriteInterceptor. Alternatively, your class can also inherit from ContentWriteInterceptorBase, which already defines methods to configure the content type to which the write interceptor applies, and the priority at which the interceptor runs compared to other applicable interceptors.

This leaves only the method intercept(ContentWriteRequest) to be implemented in custom code. The argument of the intercept method provides access to all information needed for processing the current request, which is either an update request or a create request.

The method getProperties() of the WriteRequest object returns a mutable map from property names to values that represents the intended write request. Write interceptors can read this map to determine the desired changes. They may also modify the map (which includes the ability to add additional name/value pairs if required), thereby requesting modification of the original write request, and/or additional write operations. If multiple write interceptors run in succession, they see the effects of the previous interceptors' modifications in this map.

If a blob has been created in the write request by uploading a file via Studio, it is available as UploadedBlob in the properties of the WriteRequest, providing access to the original filename.

The method getEntity() returns the content on which an update request is being executed. A write interceptor may use this method to determine the context of a write request, for example to determine the site in which the content is placed in a multi-site setting or to determine the exact type of the content. Do not write to the content object. To modify the content, update the properties map as explained above.

The method getEntity() returns null for a create request, because a write interceptor is called before a content is created. So that the interceptor is able to respond to the context of a create request, the ContentWriteRequest object provides the methods getParent(), getName(), and getType(), which provide access to the folder, the name of the content item to be created, and the content type to be instantiated.

Finally, an issues object can be retrieved by calling getIssues(). This object functions as shown in Section 9.21.1, “Validators”. In this context, it allows an interceptor to report problems observed in the write request. If a write interceptor reports any issues with error severity using the method addIssue(...) of the issues object, the write request will automatically be canceled and an error description will be shown at the client side. If issues of severity warn are detected, the write is executed, but a message box is still shown. In any case, the issues are not persisted, so that the only issues shown for a content permanently are the issues computed by the regular validators.

If a write interceptor reports an error issue the write request is canceled but the whole chain of interceptors is still executed. To stop the interceptor chain immediately without further interceptor execution a write interceptor can throw an InterceptionAbortedException which is caught during interceptor iteration. In this case a new issue with severity error is created and added to the issues instance of the given write request. Currently only the PictureUploadInterceptor throws this exception if the picture to upload is too large and exceeds a given image size limit configured with the uploadLimit interceptor property in the Spring bean configuration. This reduces the possibility the Java virtual machine runs out of memory during image blob transformations.

The following example shows the basic structure of a custom interceptor for images. A field for the name of the affected blob property is provided. The intercept() method checks whether the indicated property is updated, retrieves the new value and provides a replacement value using the properties map.

public class MyInterceptor extends ContentWriteInterceptorBase {
  private String imageProperty;

  public void setImageProperty(String imageProperty) {
    this.imageProperty = imageProperty;
  }

  public void intercept(ContentWriteRequest request) {
    Map<String,Object> properties = request.getProperties();
    if (properties.containsKey(imageProperty)) {
      Object value = properties.get(imageProperty);
      if (value instanceof Blob) {
        ...
        properties.put(imageProperty, updatedValue);
      }
    }
  }
}

Example 9.97. Defining a Write Interceptor


Search Results

Table Of Contents
warning

Your Internet Explorer is no longer supported.

Please use Mozilla Firefox, Google Chrome, or Microsoft Edge.