package org.onehippo.forge.konakart.hst.tags; import org.hippoecm.hst.content.beans.query.HstQuery; import org.hippoecm.hst.content.beans.query.HstQueryManager; import org.hippoecm.hst.content.beans.query.HstQueryResult; import org.hippoecm.hst.content.beans.query.exceptions.QueryException; import org.hippoecm.hst.content.beans.query.filter.Filter; import org.hippoecm.hst.content.beans.standard.HippoBean; import org.hippoecm.hst.core.component.HstRequest; import org.hippoecm.hst.core.request.HstRequestContext; import org.hippoecm.hst.tag.HstLinkTag; import org.hippoecm.hst.util.HstRequestUtils; import org.onehippo.forge.konakart.common.KKCndConstants; import org.onehippo.forge.konakart.hst.beans.KKProductDocument; import org.onehippo.forge.konakart.hst.utils.KKUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagData; import javax.servlet.jsp.tagext.TagExtraInfo; import javax.servlet.jsp.tagext.VariableInfo; public class ProductLinkTag extends HstLinkTag { private Logger log = LoggerFactory.getLogger(ProductLinkTag.class); private int productId; public void setProductId(int productId) { this.productId = productId; } @Override public int doStartTag() throws JspException { try { HttpServletRequest servletRequest = (HttpServletRequest) pageContext.getRequest(); HstRequest hstRequest = HstRequestUtils.getHstRequest(servletRequest); HstRequestContext requestContext = hstRequest.getRequestContext(); HstQueryManager queryManager = KKUtil.getQueryManager(requestContext); HippoBean scope = KKUtil.getSiteContentBaseBean(hstRequest); HstQuery hstQuery = queryManager.createQuery(scope, KKProductDocument.class); Filter filter = hstQuery.createFilter(); filter.addEqualTo(KKCndConstants.PRODUCT_ID, (long) productId); hstQuery.setFilter(filter); HstQueryResult queryResult = hstQuery.execute(); // No result if (queryResult.getTotalSize() != 0) { if (linkForAttributeSet) { log.warn("Incorrect usage of hst:link tag. Not allowed to specifcy two of the attributes 'link', 'hippobean', 'path' or 'siteMapItemRefId' at same time. Ignore the attr hippoBean '{}'", hippoBean.getPath()); } else { linkForAttributeSet = true; HippoBean hippoBean1 = queryResult.getHippoBeans().next(); this.link = requestContext.getHstLinkCreator().create( hippoBean1.getNode(), requestContext, preferSiteMapItem, fallback, navigationStateful); } } } catch (QueryException e) { log.error("Failed to find the Hippo product document for the productId {} - {}", productId, e.toString()); } return super.doStartTag(); } /** * TagExtraInfo class for HstURLTag. */ public static class TEI extends TagExtraInfo { public VariableInfo[] getVariableInfo(TagData tagData) { VariableInfo vi[] = null; String var = tagData.getAttributeString("var"); if (var != null) { vi = new VariableInfo[1]; vi[0] = new VariableInfo(var, "java.lang.String", true, VariableInfo.AT_BEGIN); } return vi; } } }