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>
Transport and electricity generation each account for a quarter of UK carbon emissions. Business and residential sectors – predominantly heating – represent a further third. Meeting our binding carbon budgets will require a shift from fossil fuels to renewables and other low-carbon energy sources in each of these sectors: road fuels, electricity and heat. We can achieve this transition most efficiently with hydrogen as part of the solution.
Hydrogen is a partner to electricity in a zero-carbon energy system. We can produce electricity from hydrogen and hydrogen from electricity. As with electricity, we make it from many primary energy sources so its potential availability is limitless; as with electricity, we can use it to power vehicles, homes, offices and factories; as with electricity, it produces no carbon emissions or other pollution at point of use and can be generated in carbon-free ways. Hydrogen is complementary to electricity because, unlike electricity, it can be stored without loss in large quantities and over long periods. Most significantly, hydrogen is better suited than electricity in sectors that are hardest to decarbonise: heat, heavy transport and energy-intensive industries.
Natural gas is the UK’s most important source of primary energy, representing 40 per cent of the energy used nationally. Nearly all our heat and 40 per cent of our electricity comes from burning gas. The least disruptive means to decarbonise these sectors is by reforming the natural gas to make hydrogen and carbon dioxide. We can use hydrogen as we do natural gas – in turbines, boilers and fuel cells – to make electricity and heat. The carbon dioxide needs to be captured and stored (carbon capture, utilisation and storage – CCUS). Hydrogen made from natural gas with CCUS can be supplemented with hydrogen made from biomass and waste and, with CCUS, these sources are carbon-negative.
Hydrogen can assist the integration of wind and solar power into the network by balancing the grid, both when there is too much demand and when there is too much generation. Hydrogen-fuelled generation is dispatchable; that is, it can be turned on and off rapidly to cover periods of low renewables generation and high demand. When there is surplus electricity from wind and solar farms that the grid cannot absorb, it can be used to produce hydrogen by water electrolysis.
Transport is the one sector of the UK economy in which carbon emissions are growing. Battery electric vehicles (BEVs) are part of the answer. But a third of UK road fuel is used by lorries, vans and busses. These vehicles need long-range and fast refuelling and these cannot be practically achieved with batteries. The answer is fuel cell electric vehicles running on hydrogen, which have the fuelling times and range of diesel vehicles while having zero emissions.
UK technology leadership
The UK’s heritage in making hydrogen by reforming gas goes back to ICI in the 1920s and we’ve been reforming natural gas in the UK for fertiliser production and oil refining since North Sea gas came ashore in the 1970s. The UK has the world’s best advanced reforming technology for use with CCUS. The UK also has a leading industrial and academic position in fuel cell and electrolyser technologies. Fuel cells are devices that combine hydrogen with oxygen (from the air) to produce electricity and water, first demonstrated by the Welshman, William Grove, in 1842. They are used to power both vehicles and buildings; in the case of buildings providing heat as well as electricity. Electrolysers work like fuel cells in reverse, taking electricity and using it to split water into hydrogen and oxygen. Hydrogen is already produced and handled in large volumes in the UK, with a quarter of a million tonnes produced annually. We have used hydrogen as an energy carrier before: prior to the switch to North Sea gas in the 1970s, the gas grid contained a significant proportion of hydrogen. Hydrogen is stored and distributed nationally.
A national opportunity
Beyond meeting the national carbon emissions targets, there are two pressing reasons for the UK to build hydrogen into the energy system now: improved public health and economic rewards. The public health benefits derive from improved air quality. In fuel cells, hydrogen is reacted chemically and not burnt, so there are no harmful emissions. When hydrogen is combusted, as in boilers and turbines, it produces no particulate and oxides of nitrogen (NOx) can be controlled to very low levels. These benefits apply equally to vehicles and stationary sources of pollution.
Economic benefits will come from the creation of a UK-based industry to build hydrogen energy systems at home and abroad. As noted, the UK has the core technologies required. By creating an early market in the UK, we will give UK industry an advantage in developing and demonstrating the engineering skills and supporting technologies needed to make them apply them at scale. Further benefits come from giving British industry access to decarbonised energy so that they will be best positioned to compete in global markets in a low carbon future.
The other great economic benefit will be reduced reliance on imported oil and gas and more stable domestic energy prices. The required investments are great, but so are the benefits. The UK H2Mobility project showed how fuel cell vehicles with hydrogen will be cost competitive with conventional vehicles.
Building on the UK’s advantages
The UK’s starting point is auspicious. As well as the strong technology base that we have, the UK is already committed to decarbonisation and the adoption of renewable energy. Our market is large but, as an island, contained. We have world-class engineers with a worldwide reputation. We have a well-developed gas grid that can be adapted to take increasing amounts of hydrogen, and projects such as H21 in Leeds have already assessed the viability of converting parts of the UK gas network to pure hydrogen.
But other countries share our ambition to be leaders in hydrogen energy, particularly those in northern Europe and East Asia. To make the most of its opportunity, the UK needs concerted effort and purpose across government, the energy market and industry. The two key ingredients for success are early opportunities to demonstrate technologies that have the potential to make a dramatic difference and long-term certainty on public policy. Hydrogen, then, is an essential part of the transition to a zero carbon economy.
Article originally appeared in the 15th June edition of the New Statesman.