The following has evaluated to null or missing:
==> .vars['reserved-article-group-id'] [in template "161555#161602#ARTICLE-PAGE---HERO" at line 14, column 20]
----
Tip: It's the final [] step that caused this error, not those before it.
----
Tip: If the failing expression is known to 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 groupId = .vars["reserved-art... [in template "161555#161602#ARTICLE-PAGE---HERO" at line 14, column 1]
----
1<#assign namespace = randomNamespace />
2<#assign JSONFactoryUtil = staticUtil["com.liferay.portal.kernel.json.JSONFactoryUtil"] />
3<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
4<#assign containerId = randomNamespace />
5<#assign shareURL = themeDisplay.getPortalURL()+themeDisplay.getURLCurrent()/>
6
7<#-- Auto-assign ALL category to every article -->
8<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
9<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
10<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
11
12<#-- Get current JournalArticle -->
13<#assign articleId = .vars['reserved-article-id'].data />
14<#assign groupId = .vars['reserved-article-group-id'].data?number />
15<#assign journalArticle = journalArticleLocalService.getArticle(groupId, articleId) />
16
17<#-- Get AssetEntry for this article -->
18<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()) />
19
20<#-- Your ALL category ID -->
21<#assign allCategoryId = 4614994 />
22
23<#-- Assign ALL category if not already set -->
24<#if !assetEntry.getCategories()?seq_contains(assetCategoryLocalService.getCategory(allCategoryId))>
25 <#assign categoryIds = assetEntry.getCategoryIds() + [allCategoryId] />
26 ${assetEntryLocalService.updateEntry(
27 assetEntry.getUserId(),
28 assetEntry.getGroupId(),
29 assetEntry.getClassName(),
30 assetEntry.getClassPK(),
31 assetEntry.getUuid(),
32 assetEntry.getClassTypeId(),
33 categoryIds,
34 assetEntry.getTagNames()
35 )}
36</#if>
37
38<div class="hero jmarticle__hero-main-container">
39 <div class="container">
40 <div class="row">
41 <div class="article__cont">
42 <h1 class="article__heading">${Title.getData()}</h1>
43 <#if (SubTitle.getData())??>
44 <p class="article__para">
45 ${SubTitle.getData()}
46 </p>
47 </#if>
48
49 <#assign Date_Data=getterUtil.getString(Date.getData())>
50 <#if validator.isNotNull(Date_Data)>
51 <p class="article__date">
52 <#assign Date_DateObj=dateUtil.parseDate("yyyy-MM-dd", Date_Data, locale)>
53 ${dateUtil.getDate(Date_DateObj, "dd MMMM yyyy", locale)}
54 </p>
55 </#if>
56
57 <#if Link_Title?? && Link_Title.getData()?has_content>
58 <#list Link_Title.getSiblings() as cur_Link_Title>
59 <#if cur_Link_Title?? && cur_Link_Title.getData()?has_content>
60 <#assign linkHref="#" />
61 <#assign target="" />
62
63 <#assign rowId = containerId + cur_Link_Title?index />
64 <#if cur_Link_Title.Link_Internal?? && cur_Link_Title.Link_Internal.getFriendlyUrl()?has_content>
65 <#assign linkHref=cur_Link_Title.Link_Internal.getFriendlyUrl() />
66 <#elseif cur_Link_Title.Link_Media?? && cur_Link_Title.Link_Media.getData()?has_content>
67 <#assign linkHref=cur_Link_Title.Link_Media.getData() />
68 <#elseif cur_Link_Title.Link_Mailto?? && cur_Link_Title.Link_Mailto.getData()?has_content>
69 <#assign linkHref="mailto:" + cur_Link_Title.Link_Mailto.getData() />
70 <#elseif cur_Link_Title.Link_External?? && cur_Link_Title.Link_External.getData()?has_content>
71 <#assign linkHref=cur_Link_Title.Link_External.getData() />
72 </#if>
73 <#if (cur_Link_Title.Link_Target??) && (cur_Link_Title.Link_Target.getData())?has_content>
74 <#assign target=cur_Link_Title.Link_Target.getData() />
75 </#if>
76 <div id="blue_button_click_div" data-analytics-asset-type="custom">
77 <div class="jmarticle__hero-btn-list">
78 <a id="panel_blue_button_${rowId}" class="article__btn" href="${linkHref}" title="${cur_Link_Title.getData()}" target="${target}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)" >
79 <span class="btn__text">${cur_Link_Title.getData()}</span>
80 <span class="arrow__forward"></span>
81 </a>
82 </div>
83 </div>
84 </#if>
85 </#list>
86 </#if>
87 <div class="article-download-share">
88
89 <#if PDFTitle?? && PDFTitle.getData()?has_content>
90 <#assign title = PDFTitle.getData() />
91 <#assign pdf_link = "#" />
92 <#assign pdfrowId = containerId />
93 <#if PDFTitle.PDF?? && PDFTitle.PDF.getData()?has_content>
94 <#assign pdf_link = PDFTitle.PDF.getData() />
95 </#if>
96 <div class="article-download">
97 <div id="blue_button_click_div" data-analytics-asset-type="custom">
98 <div class="jmarticle__hero-btn-list">
99 <a id="panel_blue_button_${pdfrowId}" class="article__btn" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
100 <span class="btn__text">${title}</span>
101 <span class="arrow__forward"></span>
102 </a>
103 <a id="panel_blue_button_${pdfrowId}" class="article__btn-mobile" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
104 <img src="${themeDisplay.getPathThemeImages()}/new__jm__images/download-white-icon.svg" alt="twitter image"/>
105 </a>
106 </div>
107 </div>
108 </div>
109 </#if>
110
111 </div>
112
113 </div>
114 </div>
115 <#if (ImageLarge.getData())?? && ImageLarge.getData() != "">
116 <div class="row jmarticle__hero-banner" id="jmarticle__hero-${namespace}"
117 style="background-image: url(${ImageLarge.getData()})">
118 </#if>
119
120 </div>
121 </div>
122</div>
123
124<#if Author?? && Author.getData()?has_content>
125 <div class="jmarticle__author-info">
126 <div class="container">
127 <div class="hero__bar">
128 <#list Author.getSiblings() as cur_Author>
129 <#if cur_Author?? && cur_Author.getData()?has_content>
130 <#assign
131 webContentData = jsonFactoryUtil.createJSONObject(cur_Author.getData())
132 gId = groupId
133 journalArticle = journalArticleLocalService.getArticleByUrlTitle(gId, webContentData.title)
134 docXML = saxReaderUtil.read(journalArticle.getContent())
135
136 fName = docXML.valueOf("//dynamic-element[@name='FullName']/dynamic-content/text()")
137 jobTitle = docXML.valueOf("//dynamic-element[@name='JobTitle']/dynamic-content/text()")
138 role = docXML.valueOf("//dynamic-element[@name='ContactInfo']/dynamic-content/text()")
139 photoXML = docXML.valueOf("//dynamic-element[@name='Photo']/dynamic-content/text()")
140 photoSrc = JSONFactoryUtil.createJSONObject(photoXML).getString("uuid")
141 fullName = docXML.valueOf("//dynamic-element[@name='Title']/dynamic-content/text()")
142 authorImageXML = docXML.valueOf("//dynamic-element[@name='ImageLarge']/dynamic-content/text()")
143 authImageSrc = JSONFactoryUtil.createJSONObject(authorImageXML).getString("uuid")
144 summary = docXML.valueOf("//dynamic-element[@name='Summary']/dynamic-content/text()")
145 />
146
147 <div class="author">
148 <figure class="author__image">
149 <#if authImageSrc?? && authImageSrc?has_content>
150 <img src="/documents/${groupId}/${authImageSrc}" alt="${fullName}" class="author_img_class_new">
151 <#elseif photoSrc?? && photoSrc?has_content>
152 <img src="/documents/${groupId}/${photoSrc}" alt="${fName}" class="author_img_class_new">
153 </#if>
154 </figure>
155 <div class="author__details d-flex flex-column">
156 <h3 class="author__name">
157 <a rel="author">
158 <#if fullName?? && fullName?has_content>
159 ${fullName}
160 <#elseif fName?? && fName?has_content>
161 ${fName}
162 </#if>
163 </a>
164 </h3>
165 <p class="author__desc text-size-a author_job_title">
166 <#if jobTitle?? && jobTitle?has_content>
167 ${jobTitle}
168 </#if>
169 </p>
170 <span>
171 <p class="author__desc text-size-a">
172 <#if summary?? && summary?has_content>
173 ${summary}
174 </#if>
175 <#if role?? && role?has_content>
176 ${role}
177 </#if>
178 </p>
179 </span>
180 </div>
181 <div>
182 <div class="author__contact">
183 <ul class="author__contact-list">
184 </ul>
185 </div>
186 </div>
187 </div>
188 </#if>
189 </#list>
190 </div>
191 </div>
192 </div>
193</#if>
194
195
196
197<div class="container">
198 <div class="row">
199 <div class="article__intro">
200 <#if (Introduction.getData())??>
201 ${Introduction.getData()}
202 </#if>
203
204 <div class="article-download-share">
205
206 <#if PDFTitle?? && PDFTitle.getData()?has_content>
207 <#assign title = PDFTitle.getData() />
208 <#assign pdf_link = "#" />
209 <#assign pdfrowId = containerId />
210 <#if PDFTitle.PDF?? && PDFTitle.PDF.getData()?has_content>
211 <#assign pdf_link = PDFTitle.PDF.getData() />
212 </#if>
213 <div class="article-download">
214 <div id="blue_button_click_div" data-analytics-asset-type="custom">
215 <div class="jmarticle__hero-btn-list">
216 <a id="panel_blue_button_${pdfrowId}" class="article__btn" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
217 <span class="btn__text">${title}</span>
218 <span class="arrow__forward"></span>
219 </a>
220 <a id="panel_blue_button_${pdfrowId}" class="article__btn-mobile" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
221 <img src="${themeDisplay.getPathThemeImages()}/new__jm__images/download-white-icon.svg" alt="twitter image"/>
222 </a>
223 </div>
224 </div>
225 </div>
226 </#if>
227
228
229 <div class="article-share">
230 <a href="https://linkedin.com/shareArticle?url=${shareURL}&title=<#if (Title.getData())??>${Title.getData()}</#if>" target="_blank">
231 <img class="socialicons__img" src="${themeDisplay.getPathThemeImages()}/new__jm__images/social_icons-LinkedIN.png" alt="twitter image"/>
232 </a>
233 <a href="https://twitter.com/share?url=${shareURL}&text=<#if (Title.getData())??>${Title.getData()}</#if>" target="_blank">
234 <img class="socialicons__img" src="${themeDisplay.getPathThemeImages()}/new__jm__images/social_icons-Twitter.png" alt="twitter image"/>
235 </a>
236 </div>
237 </div>
238
239 </div>
240 </div>
241</div>
242
243<style>
244 img.author_img_class_new {
245 width: 100% !important;
246 height: 100% !important;
247 position: absolute;
248 margin: auto;
249 top: 0;
250 bottom: 0;
251 }
252
253 .article__btn:focus-visible {
254 outline: 2px solid blue !important;
255}
256
257@media (min-width: 320px) and (max-width: 650px) {
258 .article__intro li {
259 margin-left: -32px !important;
260 }
261 .journal-content-article .container .article__intro {
262 margin-top: 22px !important;
263}
264}
265@media (min-width: 540px) and (max-width: 834px) {
266 .article__intro li {
267 margin-left: -32px !important;
268 }
269 .article__intro {
270 margin: 60px 15px 0 5px !important;
271 }
272}
273
274@media (min-width: 320px) and (max-width: 539px){
275.jmarticle__author-info {
276 padding: 0px 0;
277}
278.jmarticle__author-info .author__image {
279 width: 39px;
280 height: 40px;
281}
282
283.jmarticle__author-info .author__name a {
284 line-height: 0px;
285 font-size: 18px !important;
286 margin-right: 10px;
287}
288
289.jmarticle__author-info .author__desc {
290
291 line-height: 14px;
292 font-size: 12px !important;
293 margin-bottom: 7px;
294}
295}
296
297</style>
Johnson Matthey has published its integrated 2019 Annual Report, which covers all aspects of the company's financial and non-financial performance.
It describes how JM uses world class science and technology to create long term value for our shareholders and a cleaner, healthier planet for everyone. It also reflects the Global Reporting Initiative standard for non-financial data together with those issues which we believe have a material impact on our business.
The report sets out our strategy and outlines JM’s progress towards it in 2018/19, where we have:
- Continued to invest in our world class science and technology in order to:
- Maintain and build our leadership in high growth markets by solving complex problems for our customers.
- Operate our business efficiently, safely and sustainably.
- Develop and grow our great people.
It also highlights the very tangible ways our people are creating a cleaner, healthier world with products, technologies and solutions that are:
- Taking action for sustainable development.
- Shaping a new era for clean energy.
- Achieving more from less.
- Providing clean air for all.
- Helping people live longer and healthier lives.
Johnson Matthey works with customers and partners across markets from pharmaceutical and medical to automotive, industrial and chemical production. It has operations in over 30 countries and employs around 14,800 people worldwide.