Message Boards

No Entry in Workflow Instance Link

Arun Pandian, modified 4 Years ago.

No Entry in Workflow Instance Link

Junior Member Posts: 72 Join Date: 9/26/19 Recent Posts
Hi,

I have enabled the workflow for custom entity and the entity with single approver status is present in workflow definition table
i have added the entity in asset
    AssetEntry assetEntry = assetEntryLocalService.updateEntry(p.getUserId(), p.getGroupId(), p.getCreateDate(),
                p.getModifiedDate(), post.class.getName(), p.getPrimaryKey(), p.getUuid(), 0,
                serviceContext.getAssetCategoryIds(), serviceContext.getAssetTagNames(), true, p.isApproved(), null,
                null, p.getPublished_dt(), null, ContentTypes.TEXT_HTML, p.getTitle(), p.getShort_content(), null, null,
                null, 0, 0, serviceContext.getAssetPriority());
        
        System.out.println("workflow actions : " + serviceContext.getWorkflowAction());        Indexer<post> indexer = IndexerRegistryUtil.nullSafeGetIndexer(post.class);        indexer.reindex(p);

then  i have added workflow entity
    WorkflowHandlerRegistryUtil.startWorkflowInstance(p.getCompanyId(), p.getGroupId(), p.getUserId(),
                post.class.getName(), p.getPrimaryKey(), p, serviceContext);The Workflow does comes to update status method present in the custom entity

but the workflow is not going to single approver please help ,
thumbnail
Mohammed Yasin, modified 4 Years ago.

RE: No Entry in Workflow Instance Link

Liferay Master Posts: 591 Join Date: 8/8/14 Recent Posts
Hi ,
Have your implemented AssetRenderer and AssetRendererFactory for post entity ? if not please try doing it. 
You can refer this https://portal.liferay.dev/docs/7-1/tutorials/-/knowledge_base/t/creating-an-asset-renderer
Arun Pandian, modified 4 Years ago.

RE: No Entry in Workflow Instance Link

Junior Member Posts: 72 Join Date: 9/26/19 Recent Posts
<p>Yea i have implemented AssetRenderer and Factory But in different MVC portlet not in post Entity Service.<br />
But i have implemented workflow in Post Entity Service.<br />
&nbsp;</p>
thumbnail
Mohammed Yasin, modified 4 Years ago.

RE: No Entry in Workflow Instance Link

Liferay Master Posts: 591 Join Date: 8/8/14 Recent Posts
Ok.. If your AssetRenderer and AssetRendererFactory refers to post entity that should be enough .
Arun Pandian, modified 4 Years ago.

RE: No Entry in Workflow Instance Link

Junior Member Posts: 72 Join Date: 9/26/19 Recent Posts
And tell me a thing my post entity is showing in asset entry type

but when i select a entity using asset renderer it says there is no results.

but the my assets get displayed in asset publisher  when using asset renderer factory.

And my Assets are not get displayed in content under the Add portal panel and so as my post entity

am i doing anything wrong?
thumbnail
Mohammed Yasin, modified 4 Years ago.

RE: No Entry in Workflow Instance Link

Liferay Master Posts: 591 Join Date: 8/8/14 Recent Posts
Can u please share your Workflowhandler, AssetRenderer and AssetRedendererFactory ?
Arun Pandian, modified 4 Years ago.

RE: No Entry in Workflow Instance Link

Junior Member Posts: 72 Join Date: 9/26/19 Recent Posts
can you please help me on the this to find the issue. i have shared the code in below post
Arun Pandian, modified 4 Years ago.

RE: No Entry in Workflow Instance Link

Junior Member Posts: 72 Join Date: 9/26/19 Recent Posts
Post Asset Renderer :

package Post.Web.asset;
import java.util.Date;
import java.util.Locale;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.PortletURL;
import javax.portlet.WindowState;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.liferay.asset.kernel.model.AssetRendererFactory;
import com.liferay.asset.kernel.model.BaseJSPAssetRenderer;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.portlet.FriendlyURLMapper;
import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.trash.TrashRenderer;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.ResourceBundleLoader;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.post.builder.model.post;import Post.Web.constants.PostWebPortletKeys;public class PostAssetRenderer extends BaseJSPAssetRenderer<post> implements TrashRenderer {    private final post p;
    private final ResourceBundleLoader resourceBundleLoader;    public PostAssetRenderer(post po, ResourceBundleLoader resourceBundleLoader) {
        this.p = po;
        this.resourceBundleLoader = resourceBundleLoader;
    }    @Override
    public post getAssetObject() {
        return p;
    }    @Override
    public long getGroupId() {
        return p.getGroupId();
    }    @Override
    public long getUserId() {
        return p.getUserId();
    }    @Override
    public String getUserName() {
        return p.getUserName();
    }    @Override
    public String getUuid() {
        return p.getUuid();
    }    @Override
    public String getClassName() {
        return post.class.getName();
    }    @Override
    public long getClassPK() {
        return p.getPostId();
    }    @Override
    public String getSummary(PortletRequest portletRequest, PortletResponse portletResponse) {
        int abstractLength = 200;        if (portletRequest != null) {
            abstractLength = GetterUtil.getInteger(portletRequest.getAttribute(WebKeys.ASSET_ENTRY_ABSTRACT_LENGTH),
                    200);
        }        String summary = p.getShort_content();        if (Validator.isNull(summary)) {
            summary = HtmlUtil.stripHtml(StringUtil.shorten(p.getShort_content(), abstractLength));
        }
        return summary;
    }    @Override
    public int getStatus() {
        return p.getStatus();
    }    @Override
    public String getTitle(Locale locale) {
        return p.getTitle();
    }    public String getCoverImage() {
        return p.getCover_image();
    }    public String getLanguageId() {
        return p.getLanguageId();
    }    public Date getPublishedAt() {
        return p.getPublished_dt();
    }    public String getShortDesc() {
        return p.getShort_content();
    }
    @Override
    public int getAssetRendererType() {
        return super.getAssetRendererType();
    }    @Override
    public String getJspPath(HttpServletRequest request, String template) {
        System.out.println("Get JSP PATH : " + TEMPLATE_FULL_CONTENT);
        if (template.equals(TEMPLATE_ABSTRACT) || template.equals(TEMPLATE_FULL_CONTENT)) {            return "/asset/" + template + ".jsp";
        } else {            return null;
        }
    }

    @Override
    public boolean include(HttpServletRequest request, HttpServletResponse response, String template) throws Exception {
        System.out.println("include Template " + template);
        request.setAttribute(PostAssetRenderFactory.TYPE, p);
        return super.include(request, response, template);
    }    @Override
    public String getPortletId() {
        AssetRendererFactory<post> assetRendererFactory = getAssetRendererFactory();        return assetRendererFactory.getPortletId();
    }
    @Override
    public String getType() {
        // TODO Auto-generated method stub
        return PostAssetRenderFactory.TYPE;
    }
    @SuppressWarnings("deprecation")
    @Override
    public PortletURL getURLEdit(LiferayPortletRequest liferayPortletRequest,
            LiferayPortletResponse liferayPortletResponse) throws Exception {        System.out.println("into urledit");
        Group group = GroupLocalServiceUtil.fetchGroup(p.getGroupId());        PortletURL portletURL = PortalUtil.getControlPanelPortletURL(liferayPortletRequest, group,
                PostWebPortletKeys.POSTWEB, 0, 0, PortletRequest.RENDER_PHASE);        portletURL.setParameter("mvcRenderCommandName", "/blogs/edit_entry");
        portletURL.setParameter("entryId", String.valueOf(p.getPostId()));        return portletURL;
    }    @SuppressWarnings("deprecation")
    @Override
    public String getURLView(LiferayPortletResponse liferayPortletResponse, WindowState windowState) throws Exception {        AssetRendererFactory<post> assetRendererFactory = getAssetRendererFactory();        PortletURL portletURL = assetRendererFactory.getURLView(liferayPortletResponse, windowState);        portletURL.setParameter("mvcRenderCommandName", "view");
        portletURL.setParameter("PostId", String.valueOf(p.getPostId()));
        portletURL.setWindowState(windowState);
        System.out.println("GeTURLVIEW : " + portletURL.toString());
        return portletURL.toString();
    }    @Override
    public String getURLViewInContext(LiferayPortletRequest liferayPortletRequest,
            LiferayPortletResponse liferayPortletResponse, String noSuchEntryRedirect) {
        return getURLViewInContext(liferayPortletRequest, noSuchEntryRedirect, "/asset/view_context", "entryId",
                p.getPostId());
    }    @Override
    public boolean hasEditPermission(PermissionChecker permissionChecker) {        return false;
    }    @Override
    public boolean hasViewPermission(PermissionChecker permissionChecker) {        return true;
    }}
Asset Renderer Factory :

import javax.servlet.ServletContext;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.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.util.ResourceBundleLoader;
import com.post.builder.model.post;
import com.post.builder.service.postLocalService;
import Post.Web.constants.PostWebPortletKeys;@Component(immediate = true, property = {
        "javax.portlet.name=" + PostWebPortletKeys.POSTWEB }, service = AssetRendererFactory.class)public class PostAssetRenderFactory extends BaseAssetRendererFactory<post> {    private postLocalService leaveService;
    private ResourceBundleLoader resourceBundleLoader;
    private ServletContext servletContext;    public static final String TYPE = "Post Entry";    @Reference(unbind = "-")
    protected void setLeaveService(postLocalService 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 PostAssetRenderFactory() {
        setClassName(post.class.getName());
        setCategorizable(true);
        setLinkable(true);
        setPortletId(PostWebPortletKeys.POSTWEemoticon;
        setSearchable(true);
        setSelectable(true);
    }    @Override
    public AssetRenderer<post> getAssetRenderer(long classPK, int type) throws PortalException {
        post leave = leaveService.getpost(classPK);
        PostAssetRenderer assetRenders = new PostAssetRenderer(leave, resourceBundleLoader);
        assetRenders.setAssetRendererType(type);
        assetRenders.setServletContext(servletContext);
        return assetRenders;
    }    @Override
    public String getType() {
        return TYPE;
    }    @Override
    public String getClassName() {
        return post.class.getName();
    }
    
    @Override
    public String getIconCssClass() {
        return "blogs";
    }
    
    
    @Override
    public boolean hasPermission(PermissionChecker permissionChecker,
    long entryClassPK, String actionId) throws Exception {
    return true;
    }
}

Workflow Handler :
package com.post.builder.workflow;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.WorkflowDefinitionLink;
import com.liferay.portal.kernel.security.permission.ResourceActions;
import com.liferay.portal.kernel.security.permission.ResourceActionsUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalServiceUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.workflow.BaseWorkflowHandler;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.kernel.workflow.WorkflowHandler;
import com.post.builder.model.post;
import com.post.builder.service.postLocalService;
import java.io.Serializable;
import java.util.Locale;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@SuppressWarnings("unused")
@Component(immediate = true,property= {"model.class.name=com.post.builder.model.post"},
service = WorkflowHandler.class)public class PostWorkflowHandler extends BaseWorkflowHandler<post> {    @Override
    public String getClassName() {
        // TODO Auto-generated method stub
        return post.class.getName();
    }    @Override
    public String getType(Locale locale) {
         return ResourceActionsUtil.getModelResource(locale, getClassName());
    }
    @Override
    public post updateStatus(int status, Map<String, Serializable> workflowContext) throws PortalException {        long userId = GetterUtil.getLong((String) workflowContext.get(WorkflowConstants.CONTEXT_USER_ID));
        long resourcePrimKey = GetterUtil
                .getLong((String) workflowContext.get(WorkflowConstants.CONTEXT_ENTRY_CLASS_PK));        ServiceContext serviceContext = (ServiceContext) workflowContext.get(WorkflowConstants.CONTEXT_SERVICE_CONTEXT);        return _postLocalService.updateStatus(userId, resourcePrimKey, status, serviceContext);
        
    }    @Reference(unbind = "-")
    protected void setPostLocalService(postLocalService postLocalService) {        _postLocalService = postLocalService;
    }    @Reference(unbind = "-")
    protected void setResourceActions(ResourceActions resourceActions) {        _resourceActions = resourceActions;
    }    private postLocalService _postLocalService;
    private ResourceActions _resourceActions;}