Decorating ResultItems

To decorate ResultItems you must write a Java decorator class that:

  • Extends com.escenic.framework.decorator.OnDemandResultItemDecorator

  • Overrides OnDemandResultItemDecorator's createExtraInfo and createRelated methods.

The following example shows a RelatedVideoDecorator that decorates a ResultItem with related videos.

package com.escenic.framework.widget.common;

import com.escenic.framework.decorator.OnDemandResultItemDecorator;
import com.escenic.framework.presentation.ResultItem;
import neo.xredsys.presentation.PresentationElement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class RelatedVideoDecorator extends OnDemandResultItemDecorator {
private int mMaxItem;
private String mKey;

public class RelatedVideoDecorator extends OnDemandResultItemDecorator {
  private int mMaxItem;
  private String mKey;

  public RelatedVideoDecorator(final ResultItem pResultItem,
                               final String pKey,
                               final int pMaxItem) {
    super(pResultItem);
    mMaxItem = pMaxItem > 0 ? pMaxItem : Integer.MAX_VALUE;
    mKey = pKey.toLowerCase();
  }

  @Override
  protected Object createExtraInfo(final String pKey) {
    return null;
  }

  @Override
  protected List<PresentationElement> createRelated(final String pKey) {
    if (pKey.equals(mKey)) {
      // retrieve all related videos
      List<PresentationElement> relatedVideos = new ArrayList<>();
      relatedVideos = getRelatedVideos(mMaxItem);
      return relatedVideos;
    }
  return null;
  }
}

You also need to write a Java processor class that invokes the decorator class you have created to decorate the ResultItem.

This class must:

  • Extend com.escenic.framework.controller.processor.ResultItemDecoratorProcessor

  • Override ResultItemDecoratorProcessor's createResultItemTransformer method

This RelatedVideoDecoratorProcessor class, for example, invokes the example RelatedVideoDecorator.

package com.mycompany.view.processor;

import com.escenic.framework.controller.processor.ResultItemDecoratorProcessor;
import com.escenic.framework.decorator.ResultItemDecorator;
import com.escenic.framework.presentation.ResultItem;
import com.escenic.framework.widget.common.RelatedVideoDecorator;
import com.google.common.base.Function;
import java.util.Map;

public class RelatedVideoDecoratorProcessor extends ResultItemDecoratorProcessor {
  private int mMaxItems;

  @Override
  protected Function<ResultItem, ResultItemDecorator>
      createResultItemTransformer(final Map<String, Object> pWidgetContext) {
    return new Function<ResultItem, ResultItemDecorator>() {
      @Override
      public ResultItemDecorator apply(final ResultItem pResultItem) {
        ResultItemDecorator decoratedItem = new RelatedVideoDecorator(
          pResultItem, "videos", getMaxItems());
        return decoratedItem;
      }
    };
  }

  public int getMaxItems() {
    return mMaxItems;
  }

  public void setMaxItems(final int pMaxItems) {
    mMaxItems = pMaxItems;
  }
}

Now create a properties file called RelatedVideoDecoratorProcessor.properties and add the following:

$class=com.mycompany.view.processor.RelatedVideoDecoratorProcessor
viewNames=default

maxItems=5

Finally, register the above model processor. For further information about model processor configuration, please see Configuration.

The ResultItem's related videos will now be accessible from JSPs as follows:

${requestScope.resultItem.related.videos}