An error occurred while processing the template.
The following has evaluated to null or missing:
==> rootDoc.selectSingleNode(promotionPath)  [in template "20155#20195#5890918" at line 66, column 45]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign promotionContent = rootDoc.se...  [in template "20155#20195#5890918" at line 66, column 17]
----
1<#-- 
2  ~ Copyright (c) 2020 AXA Group Operations Spain S.A. 
3
4  ~ Licensed under the AXA Group Operations Spain S.A. License (the "License"); 
5  ~ you may not use this file except in compliance with the License. 
6  ~ A copy of the License can be found in the LICENSE.TXT file distributed 
7  ~ together with this file. 
8
9  ~ Unless required by applicable law or agreed to in writing, software 
10  ~ distributed under the License is distributed on an "AS IS" BASIS, 
11  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
12  ~ See the License for the specific language governing permissions and 
13  ~ limitations under the License. 
14  --> 
15 
16<#if entries?has_content> 
17    <#assign size = entries?size> 
18    <#assign navClass = ""> 
19 
20    <#if size  == 2> 
21        <#assign navClass = "two-promotions"> 
22    <#elseif size  == 3> 
23        <#assign navClass = "three-promotions"> 
24    <#elseif size == 4> 
25        <#assign navClass = "four-promotions"> 
26    </#if> 
27 
28    <div class="promotions-nav ${navClass}"> 
29        <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
30        <#assign SAXReader = serviceLocator.findService("com.liferay.portal.kernel.xml.SAXReader") /> 
31        <#assign layoutLocalService = serviceLocator.findService('com.liferay.portal.kernel.service.LayoutLocalService') /> 
32        <#assign fileEntry = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') /> 
33        <#assign imageMimeTypes = ["image/bmp", "image/gif", "image/jpeg", "image/png", "image/tiff", "image/x-ms-bmp", "image/x-tiff"] /> 
34        <#list entries as curEntry> 
35        <#-- The navigation-banner must have at most 4 items --> 
36            <#if (curEntry_index >= 4)> 
37                <#break> 
38            </#if> 
39        <#-- Configures the localization of the entry --> 
40            <#assign assetRenderer = curEntry.getAssetRenderer() /> 
41            <#assign className = assetRenderer.getClassName() /> 
42            <#assign has_link = false /> 
43 
44            <#if className == "com.liferay.journal.model.JournalArticle"> 
45                <#assign curArticle = journalArticleLocalService.getLatestArticle(curEntry.getClassPK()) /> 
46                <#assign docArticle = SAXReader.read(curArticle.getContentByLocale(themeDisplay.getLanguageId())) > 
47                <#assign rootDoc = docArticle.getRootElement()> 
48 
49                <#assign availableLocales = rootDoc.attribute("available-locales").getText() /> 
50                <#assign defaultLocale = rootDoc.attribute("default-locale").getText() /> 
51                <#if (availableLocales?contains(locale)) > 
52                    <#assign curLocale = locale /> 
53                <#else> 
54                    <#assign curLocale = defaultLocale /> 
55                </#if> 
56                 
57                <#assign promotionPath = "dynamic-element[@name='Promotion']/dynamic-content[@language-id='${curLocale}']" /> 
58                <#assign textPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Text']/dynamic-content[@language-id='${curLocale}']" /> 
59                <#assign linkTypePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='type_link']/dynamic-content[@language-id='${curLocale}']" /> 
60                <#assign buttonTextPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='ButtonText']/dynamic-content[@language-id='${curLocale}']" /> 
61                <#assign linkToPagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_page']/dynamic-content[@language-id='${curLocale}']" /> 
62                <#assign externalLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link']/dynamic-content[@language-id='${curLocale}']" /> 
63                <#assign internalDocumentLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_document']/dynamic-content[@language-id='${curLocale}']" /> 
64                <#assign imagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Image']/dynamic-content[@language-id='${curLocale}']" /> 
65 
66                <#assign promotionContent = rootDoc.selectSingleNode(promotionPath).getText() /> 
67                <#assign textContent = rootDoc.selectSingleNode(textPath).getText() /> 
68                <#assign buttonTextContent = rootDoc.selectSingleNode(buttonTextPath).getText() /> 
69                <#assign imageContent = rootDoc.selectSingleNode(imagePath).getText() /> 
70 
71            <#-- Button link can be a Link To Page, an External Link or an Internal Document Link --> 
72                <#assign linkUrl = "" /> 
73 
74                <#if rootDoc.selectSingleNode(linkTypePath)?? > 
75                    <#assign linkTypeContent = rootDoc.selectSingleNode(linkTypePath).getText() /> 
76                <#else> 
77                    <#assign linkTypeContent = "" /> 
78                </#if> 
79                <#if rootDoc.selectSingleNode(linkToPagePath)?? > 
80                    <#assign linkToPageContent = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
81                <#else> 
82                    <#assign linkToPageContent = "" /> 
83                </#if> 
84                <#if rootDoc.selectSingleNode(externalLinkPath)?? > 
85                    <#assign externalLinkContent = rootDoc.selectSingleNode(externalLinkPath).getText() /> 
86                <#else> 
87                    <#assign externalLinkContent = "" /> 
88                </#if> 
89                <#if rootDoc.selectSingleNode(internalDocumentLinkPath)?? > 
90                    <#assign internalDocumentLinkContent = rootDoc.selectSingleNode(internalDocumentLinkPath).getText() /> 
91                <#else> 
92                    <#assign internalDocumentLinkContent = "" /> 
93                </#if> 
94 
95            <#-- Background image --> 
96                <#assign backgroundStyle="" /> 
97                <#assign promoClass = "" /> 
98                <#assign isImage = imageContent?has_content && imageContent != ""/> 
99                <#if isImage> 
100                <#-- Checks the if the image field actually contains an image --> 
101                    <#assign parts = imageContent?split("/") /> 
102                    <#assign groupId = parts[2]?number /> 
103                    <#assign uuId = parts[5] /> 
104 
105                    <#if uuId?contains("?") > 
106                        <#assign uuId = uuId?substring(0, parts[5]?index_of("?")) /> 
107                    </#if> 
108 
109                    <#assign file=fileEntry.getFileEntryByUuidAndGroupId(uuId, groupId) /> 
110                    <#assign mimeType = file.getMimeType() /> 
111                    <#assign isImage = imageMimeTypes?seq_contains(mimeType) /> 
112 
113                    <#if isImage > 
114                        <#assign backgroundStyle="background-image: url(${imageContent});" /> 
115                        <#assign promoClass = "promotion-image gh-promo-image-${curEntry_index}" /> 
116                    </#if> 
117                </#if> 
118 
119                <#assign has_page = linkTypeContent == "link_to_page" && linkToPageContent != "" /> 
120                <#assign has_ext = linkTypeContent == "link_extern" && externalLinkContent != "" /> 
121                <#assign has_doc = linkTypeContent == "document_library" && internalDocumentLinkContent != "" /> 
122                <#assign has_link = buttonTextContent?has_content && buttonTextContent!="" && (has_page || has_ext || has_doc) /> 
123            <#--hotfix in order to open any link in the same page, before it was like the commented <#assign target = "BLA BLA" /> below--> 
124                <#assign target = "_self" /> 
125 
126                <#if buttonTextContent != "" && (has_page || has_ext || has_doc)> 
127 
128                    <#if has_page> 
129                    <#-- Retrieves the Link To Page content in the form [layoutId]@[pageType]@[groupId] i.e. "348@public@9246542" --> 
130                        <#assign linkToPageString = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
131                        <#assign linkToPageArray = linkToPageString?split("@") /> 
132 
133                    <#-- Splits the Link To Page content in the three parameters for the getLayout method --> 
134                        <#assign linkToPageGroupId = linkToPageArray[2]?number /> 
135                        <#assign linkToPageIsPrivate = (linkToPageArray[1] == "private") /> 
136                        <#assign linkToPageLayoutId = linkToPageArray[0]?number /> 
137 
138                    <#-- obtains the LinkToPage url depending on the source of the asset (same or different site) --> 
139                        <#attempt > 
140                            <#if curEntry.getGroupId() != themeDisplay.getSiteGroupId() > 
141 
142                            <#-- Gets the Page Friendly URL to be appended to the base URL--> 
143                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
144                                <#assign linkToPageFriendlyUrl = linkToPageLayout.getFriendlyURL(locale) /> 
145 
146                            <#-- Base URL in case current URL with Backoffice --> 
147                                <#if currentURL?contains("/web/") > 
148                                    <#assign linkToPageGroup = groupLocalServiceUtil.getGroup(linkToPageGroupId) /> 
149                                    <#assign groupFriendlyUrl = portalUtil.getGroupFriendlyURL(linkToPageGroup, linkToPageIsPrivate, themeDisplay) /> 
150                                    <#assign layoutFriendlyUrl = groupFriendlyUrl + linkToPageFriendlyUrl /> 
151 
152                                <#-- Base URL in case current URL with Virtual Host --> 
153                                <#else> 
154                                    <#assign linkToPageLayoutSet = layoutSetLocalService.getLayoutSet(linkToPageGroupId, linkToPageIsPrivate) /> 
155                                    <#assign linkToPageVirtualHostname = linkToPageLayoutSet.getVirtualHostname() /> 
156 
157                                    <#if request.getProtocol()?contains("HTTPS") > 
158                                        <#assign protocol = "https://" /> 
159                                    <#else> 
160                                        <#assign protocol = "http://" /> 
161                                    </#if> 
162 
163                                    <#assign urlPort = "" /> 
164                                    <#assign serverPort = request.getServerPort() /> 
165 
166                                    <#if serverPort != 80 > 
167                                        <#assign urlPort = ":" + serverPort?string /> 
168                                    </#if> 
169 
170                                    <#assign layoutFriendlyUrl = protocol + linkToPageVirtualHostname + urlPort + linkToPageFriendlyUrl /> 
171                                </#if> 
172                            <#else> 
173                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
174                                <#assign layoutFriendlyUrl = portalUtil.getLayoutFriendlyURL(linkToPageLayout, themeDisplay) /> 
175                            </#if> 
176 
177                            <#assign linkUrl = "${layoutFriendlyUrl}" /> 
178 
179                            <#recover> 
180                                <#assign linkUrl = "" /> 
181                                <#assign has_link = false /> 
182                        </#attempt> 
183                    <#elseif has_ext> 
184                        <#assign linkUrl = "${externalLinkContent}" /> 
185                    <#elseif has_doc> 
186                        <#assign linkUrl = "${internalDocumentLinkContent}" /> 
187                    </#if> 
188                </#if> 
189            </#if> 
190 
191            <#-- If the promotions does not have the link configured, the box will be shown --> 
192            <#if has_link > 
193                  <#assign escapedContentTitle = assetRenderer.getTitle(locale)?replace("\'","")?replace("/","")?replace("\"","") /> 
194                  <a href='${linkUrl}' class="promotion ${promoClass} gh-promotion-item"  onclick="tagCoNotifier.notifyBanner(event,tagCoNotifier.navigatorBannerType,'${escapedContentTitle}')" style="${backgroundStyle}"> 
195            <#else> 
196                <div class="promotion ${promoClass} gh-promotion-item" style="${backgroundStyle}"> 
197            </#if> 
198                    <div class="promotion-100"></div> 
199                    <div class="container"> 
200                        <div class="promotion__content promotion-100"> 
201                            <h2 class="promotion__title gh-promotion-title-${curEntry_index}">${promotionContent}</h2> 
202                            <p class="promotion__abstract gh-promotion-text-${curEntry_index}">${textContent}</p> 
203                        <#if has_link > 
204                            <button class="button danger gh-promotion-button-${curEntry_index}">${buttonTextContent}</button> 
205                        </#if> 
206                        </div> 
207                    </div> 
208            <#if has_link > 
209                </a> 
210            <#else> 
211                </div/ 
212            </#if> 
213        </#list> 
214    </div> 
215</#if> 

Continuing to deliver resilient performance

Simon Baxter, Credit Fund Portfolio Manager

What is the greatest challenge you are facing in your role during the current global crisis?

The volatility in the financial markets has created a lot of uncertainly, but also opportunity.  We are seeking to identify and separate those companies that will bounce back strongly from the current economic downturn from those that will suffer longer-term damage to ensure that our clients are invested appropriately during this volatile period.

What have you adapted successfully in your way of working?

We have adapted our team communications to working remotely, utilising a centralised online chat room to discuss daily priorities and goals.  We arrange conference calls when we need a broader conversation, discussion or idea-generating session.

What do you miss most and why?

I miss daily interactions, in person, with colleagues, counterparts and clients.  Being physically present helps you better understand questions, concerns, priorities etc., and can break down some of the barriers to effective communication. 

There’s also the social aspect, which helps build and maintain relationships and is hard to replicate in the virtual world.

What has improved in the job you do?

A remote working environment helps you focus on the tasks at hand – there are less distractions, less meetings and less background noise in general.  Some people find this a challenge and need the general background “humm” of the office to work effectively; I find the opposite – there’s more time to read, think and process information clearly and quietly.

What have you been most surprised by?

The quality of the remote PC systems – I am able to fully function, equivalent to being in the office.  Yes, I cannot give a verbal instruction, in person, to my trader but he’s just at the end of the phone (or the keyboard).  It really is a very seamless set up and, when and if things get back to normal, I think a lot of people will be giving more thought to working from home increasingly regularly.

What will you tackle / improve next week?

Email!  Volatility in the markets results in a deluge of information – research reports, news feeds, opinions etc.  Finding an efficient way to categorise, sort and filter the useful information from the useless remains a key goal.  I’ve only been working on this now for 15 years – perhaps next week I’ll find the solution!

What will you retain / keep up when normality resumes?

On a professional note, volatile times typically result in a large increase in the volume of queries from clients and also in the appropriate levels of communications we wish to proactively share.  I hope these increased communications, together with the actions we are taking in client portfolios, are valued and continue post coronavirus.

On a personal note, this period of self-isolation is a reminder of the value of personal relationships, which many of us miss when they are taken away.  I think keeping a healthy focus on the things that really matter will be the goal, when we all get back to normal.