Decorating ResultItems
To decorate ResultItem
s you must write a Java
decorator class that:
-
Extends
com.escenic.framework.decorator.OnDemandResultItemDecorator
-
Overrides
OnDemandResultItemDecorator
'screateExtraInfo
andcreateRelated
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
'screateResultItemTransformer
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}