Liferay 7 Asset Render Factory Example


Liferay 7 Asset Render Factory Example

In this tutorial, we will make the custom entity as asset so that it can be accessible Liferay frameworks such as comments,asset publishers and workflow. The below tutorial is continuation to below one:

Liferay 7 CRUD Portlet Tutorial

This tutorial  is an extension to Liferay 7 Portlet Tutorial. In this tutorial, we will implement basic leave system application with service builder and liferay components. Installations: Liferay Eclipse Neon IDE 3.1.0 M1   :…READ MORE

Custom Entity need to be make as an Asset in order to use below Liferay features:

  • Extensively render your assets.
  • workflow integration
  • Comments
  • Rating – using a five star rating system
  • flagging content
  • track the number of times entity is viewed
  • categories
  • tags
  • asset publisher
  • bookmarks
  • trash
  • Adding custom fields
  • Asset Publisher

How to make custom entity as Asset?

  • Define AssetEntry reference in service.xml
    1. <reference entity="AssetEntry" package-path="com.liferay.portlet.asset" />
       <reference entity="AssetTag" package-path="com.liferay.portlet.asset" /
  • When adding entry then invoked assetEntryLocalService.updateEntry() method
    •   AssetEntry assetEntry = assetEntryLocalService.updateEntry( user.getUserId(), serviceContext.getScopeGroupId(), 
       new Date(), new Date(), Leave.class.getName(), leave.getLeaveId(), leave.getUuid(),0, null, null, true, 
       false, new Date(), null,new Date(), null,ContentTypes.TEXT_HTML, leave.getLeaveName(), leave.getLeaveName(), 
       null, null, null, 0, 0, null);
  • When updating entry then
    • assetEntryLocalService.updateEntry(Leave.class.getName(), leaveId, new Date(),null, true, true);
  • To update the Asset visibility then invoke below method:
    • assetEntryLocalService.updateVisible(Leave.class.getName(), leaveId, false);

What Next after adding entry into AssetEntry table?

  •  The Entity need to be displayed on the user interface.  Liferay provides Asset Publisher API for default rendering of custom entity attributes such as title and description.
  •  Liferay also provides custom AssetRenderer API to display additional attributes and editing entity

High Level Steps:

  1. Create Asset Renderer
  2. Create AssetRenderer Factory OSGI service  to create AssetRenderer

Let’s use the existing leave application explained in the below and ill make Leave Entity as Asset Renderer

  • Create the packages “org.javasavvy.leave.asset” and Create classes LeaveAssetRenderer and LeaveAssetRenderFactory.javaLeave AssetRender Factory
  • AssetRenderer class is:
    1. package org.javasavvy.leave.asset;
      
      import java.util.Locale;
      import javax.portlet.PortletRequest;
      import javax.portlet.PortletResponse;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import org.javasavvy.leave.model.Leave;
      import com.liferay.asset.kernel.model.BaseJSPAssetRenderer;
      import com.liferay.portal.kernel.util.ResourceBundleLoader;
      
      public class LeaveAssetRenderer extends BaseJSPAssetRenderer<Leave> {
      
       private final Leave leave;
       private final ResourceBundleLoader resourceBundleLoader;
       
       public LeaveAssetRenderer(Leave leave, ResourceBundleLoader resourceBundleLoader) {
            this.leave = leave;
            this.resourceBundleLoader = resourceBundleLoader;
       }
       
       @Override
       public Leave getAssetObject() {
            return leave;
       }
       @Override
       public long getGroupId() {
           return leave.getGroupId();
       }
       @Override
       public long getUserId() {
           return leave.getUserId();
       }
      
       @Override
       public String getUserName() {
           return leave.getUserName();
       }
      
       @Override
       public String getUuid() {
           return leave.getUuid();
       }
       @Override
       public String getClassName() {
           return Leave.class.getName();
       }
      
       @Override
       public long getClassPK() {
           return leave.getLeaveId();
       }
      
       @Override
       public String getSummary(PortletRequest portletRequest, PortletResponse portletResponse) {
           return leave.getLeaveName()+ "by "+leave.getUserName()+",from:"+leave.getStartDate();
        }
       
       @Override
       public int getStatus() {
           return leave.getStatus();
       }
      
       @Override
       public String getTitle(Locale locale) {
          return leave.getLeaveName();
       }
      
       @Override
       public int getAssetRendererType() {
          return super.getAssetRendererType();
       }
       
       @Override
       public String getJspPath(HttpServletRequest request, String template) {
           return "/leave/leaveAssetInfo.jsp";
       
       }
       
       @Override
       public boolean include(HttpServletRequest request, HttpServletResponse response, String template) throws Exception {
          request.setAttribute("leaveEntry", leave);
          return super.include(request, response, template);
       }
      
      }
  • LeaveAssetRenderFactory class:
    • This class need to be OSGI Service type of AssetRendererFactory
    • The class need below @component
      1. @Component(
         immediate = true,
         property = {"javax.portlet.name=org_javasavvy_web_leave_portlet"},
         service = AssetRendererFactory.class
         )
    • package org.javasavvy.leave.asset;
      
      import javax.servlet.ServletContext;
      
      import org.javasavvy.leave.model.Leave;
      import org.javasavvy.leave.service.LeaveLocalService;
      import org.osgi.service.component.annotations.Component;
      import org.osgi.service.component.annotations.Reference;
      
      import com.liferay.asset.kernel.model.AssetRenderer;
      import com.liferay.asset.kernel.model.AssetRendererFactory;
      import com.liferay.asset.kernel.model.BaseAssetRendererFactory;
      import com.liferay.portal.kernel.exception.PortalException;
      import com.liferay.portal.kernel.util.ResourceBundleLoader;
      
      @Component(
       immediate = true,
       property = {"javax.portlet.name=org_javasavvy_web_leave_portlet"},
       service = AssetRendererFactory.class
       )
      public class LeaveAssetRenderFactory extends BaseAssetRendererFactory<Leave> {
       
       private LeaveLocalService leaveService;
       private ResourceBundleLoader resourceBundleLoader;
       private ServletContext servletContext;
      
       @Reference(unbind = "-")
       protected void setLeaveService(LeaveLocalService leaveService) {
            this.leaveService = leaveService;
       }
      
       @Reference(unbind = "-")
       public void setResourceBundleLoader(ResourceBundleLoader resourceBundleLoader) {
           this.resourceBundleLoader = resourceBundleLoader;
       }
      
       @Reference(unbind = "-")
       public void setServletContext(ServletContext servletContext) {
           this.servletContext = servletContext;
       }
       
       public LeaveAssetRenderFactory() {
              setClassName( Leave.class.getName());
              setCategorizable(true);
              setLinkable(true);
              setPortletId("org_javasavvy_web_leave_portlet");
              setSearchable(true);
               setSelectable(true);
       }
      
       @Override
       public AssetRenderer<Leave> getAssetRenderer(long classPK, int type) throws PortalException {
            Leave leave = leaveService.getLeave(classPK);
            LeaveAssetRenderer assetRenders = new LeaveAssetRenderer(leave, resourceBundleLoader);
            assetRenders.setAssetRendererType(type);
            assetRenders.setServletContext(servletContext);
           return assetRenders;
       }
      
       @Override
       public String getType() {
           return "leave";
       }
      
       @Override
       public String getClassName() {
           return Leave.class.getName();
       }
      }

 

 

6 thoughts on “Liferay 7 Asset Render Factory Example”
  1. Hello,

    I have tried to create asset render as you mentioned in this post.

    But it is still doesn’t show me asset entry in asset publisher.

    Asset Renderer factory constructor is called but getAssetRenderer method is not executed.

    Could you pelase share with me if you have any working example ?

      1. Hi Ankit,

        I have written Indexer for my custom asset, but still getAssetRenderer method is not executed when viewing Asset Publisher Portlet, however it is working fine when associate OOTB workflow to my custom asset.

  2. Hi,
    I have created the assetRenderer and factory class and also the indexer as well .. my custom entity is showing up in the asset publisher application dropdown of asset type but when I choose my entity it shows nothing :-/.

  3. I have created the assetRenderer and factory class and also the indexer as well .. my custom entity is showing up in the asset publisher application dropdown of asset type but when I choose my entity it shows nothing

Comments are closed.