We are what we do: our business, our products.
An error occurred while processing the template.
No compatible overloaded variation was found; can't convert (unwrap) the 1st argument to the desired Java type.
The FTL type of the argument values were: sequence+extended_hash+string (wrapper: f.c.DefaultToExpression$EmptyStringAndSequenceAndHash), extended_hash+string (com.liferay.portal.kernel.theme.ThemeDisplay wrapped into f.e.b.StringModel).
The matching overload was searched among these members:
    com.liferay.portal.util.PortalImpl.getLayoutFriendlyURL(com.liferay.portal.kernel.model.Layout, com.liferay.portal.kernel.theme.ThemeDisplay),
    com.liferay.portal.util.PortalImpl.getLayoutFriendlyURL(com.liferay.portal.kernel.theme.ThemeDisplay),
    com.liferay.portal.util.PortalImpl.getLayoutFriendlyURL(com.liferay.portal.kernel.model.Layout, com.liferay.portal.kernel.theme.ThemeDisplay, Locale)

----
FTL stack trace ("~" means nesting-related):
	- Failed at: productDetailURL = portalUtil.getLayo...  [in template "20115#20151#197212" at line 9, column 9]
----
1<@leonardo.articleInfo .vars "SP-Product-complete-listing"/> 
2<#assign  
3	journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") 
4	articleId = .vars['reserved-article-id'].data 
5	article = journalArticleLocalService.getArticle(groupId, articleId) 
6	productLayout = (article.getLayout()!) 
7	isProductPage = false 
8	target = ((layout.getGroup().getGroupId()) != (article.getGroupId()))?then("_blank","_self") 
9	productDetailURL = portalUtil.getLayoutFriendlyURL(productLayout, themeDisplay) 
10
11 
12<#if (layout.getGroup().getGroupId()) != (article.getGroupId())> 
13	<#assign productDetailURL = portalUtil.getVirtualHostname (productLayout.getLayoutSet())> 
14	<#if (productDetailURL)?has_content && (productDetailURL?lower_case != 'localhost')> 
15		<#assign productDetailURL = 'https://' + productDetailURL > 
16	<#else> 
17		<#assign productDetailURL = ''> 
18	</#if> 
19	<#assign productDetailURL = productDetailURL + productLayout.getFriendlyURL()> 
20</#if> 
21 
22<#assign scalingDetails = { 
23	 "desktop": {"alternateImage": {}, "key": "w_317"}, 
24	 "tl": {"alternateImage": SeparatorOverview.OverviewImage.ImageTl!, "key": "w_317"}, 
25	 "tp": {"alternateImage": SeparatorOverview.OverviewImage.ImageTp!, "key": "w_317"}, 
26	 "mobile": {"alternateImage": SeparatorOverview.OverviewImage.ImageM!, "key": "w_317"} 
27}> 
28<#assign dataImg = leonardo.adaptImage(SeparatorOverview.OverviewImage!, scalingDetails )> 
29 
30<#if (layout.layoutPrototypeUuid)?has_content> 
31	<#assign  
32		layoutPrototypeLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutPrototypeLocalService") 
33		layoutPrototype = layoutPrototypeLocalService.fetchLayoutPrototypeByUuidAndCompanyId(layout.layoutPrototypeUuid, themeDisplay.getCompanyId()) 
34
35	<#if ((layoutPrototype)?has_content) && (layoutPrototype.getName(locale) == "Sheet Product (SP)")> 
36		<#assign isProductPage = true> 
37	</#if> 
38</#if> 
39<#if (productLayout)?has_content> 
40	<#assign f = paramUtil.getString(themeDisplay.getRequest(), "f") /> 
41	<#if isProductPage> 
42		<#-- SP --> 
43		<#assign url = productDetailURL> 
44	<#elseif f?has_content> 
45		<#if f == "/all-products" || f == "/search"> 
46			<#assign url = productDetailURL + "?f=" + f> 
47		<#else> 
48			<#-- PSP --> 
49			<#assign url = productDetailURL + "?f=" + layout.getFriendlyURL()> 
50		</#if> 
51	<#else> 
52		<#assign url = productDetailURL + "?f=" + layout.getFriendlyURL()> 
53	</#if> 
54</#if> 
55 
56<!--Start Module: Product Card--> 
57<div class="product-card invisible"> 
58    <#if url?has_content> 
59    <a class="product-card--wrap" href="${url!}" target="${target}" title="${SeparatorOverview.ProductName.getData()!}"> 
60    </#if> 
61		<div class="product-card--graphic-container"> 
62		    <img class="product-card--graphic" alt="${SeparatorOverview.ProductName.getData()!}" src="${themeDisplay.pathThemeImages}/blank.png" 
63		        data-lazy-src-url-d="${dataImg.desktop!}"  
64				data-lazy-src-url-tl="${dataImg.tablet_landscape!}"  
65				data-lazy-src-url-tp="${dataImg.tablet_portrait!}"   
66				data-lazy-src-url-m="${dataImg.mobile!}"/> 
67		</div> 
68		<div class="product-card--desc"> 
69		<#assign summary = .vars['reserved-article-description'].data!> 
70		<#if summary?length gt 1> 
71			<span class="title">${SeparatorOverview.ProductName.getData()!}</span> ${summary!} 
72		<#elseif summary?length == 1> 
73			<span class="title">${SeparatorOverview.ProductName.getData()!}</span> 
74		<#else> 
75			<#assign maxlength = 150 > 
76			<#assign nameLength = SeparatorOverview.ProductName.getData()?length > 
77			<#assign maxlength = maxlength - nameLength > 
78			<#if maxlength gte 0> 
79				<span class="title">${SeparatorOverview.ProductName.getData()!}</span> ${leonardo.stringEllipsis(htmlUtil.extractText(SeparatorOverview.OverviewText.getData()!), maxlength)} 
80			<#else> 
81				<span class="title">${SeparatorOverview.ProductName.getData()!}</span> 
82			</#if> 
83		</#if> 
84		</div> 
85	<#if url?has_content> 
86	</a> 
87	</#if> 
88</div> 
89<!--End Module: Product Card-->